当我输入,
而不是.
时,我实际上返回了float
值,但它没有给我任何错误。然后我试着运行下面的代码。
#include<stdio.h>
#include<conio.h>
int getValue();
int main()
{
int a = getValue();
printf("%d", a);
return 0;
}
int getValue()
{
return 2, 3;
}
现在输出是3,这是它返回的第二个值。这件事发生在两年前,从那以后我一直在寻找正确的答案。
研究这个问题的答案,我知道它在求值后返回第二个值,但是它对第一个值做了什么?
我研究了堆栈的逻辑(值是如何在内部推送和弹出的),但我不认为这与它有任何关系。
是处理两个值还是做其他事情?
引用C11
标准,第6.5.17章,逗号操作符
逗号操作符的左操作数计算为空表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有其类型和值。
现在,回答你的问题
与第一个有什么关系?
我们可以说,第一个操作数(左操作数)对求值,结果是被丢弃。
注意:我提到的是结果,而不是效果。澄清一下,在你的例子中,你不会注意到的效果,但是你可以注意到的效果,如果左边和右边的表达式都与同一个变量相关。例如,让我们讨论一个简单的示例
return p=3, p+2;
我们可以将return
语句分解为
- 赋值
3
给变量p
[,
的左侧运算符] - 执行
p+2
,生成5
的值。[,
的右侧运算符] -
return
将值5
作为第二个参数的值[在子句",
运算符的结果具有其(右操作数的求值)类型和值"之后。)
查看现场演示
逗号运算符将从左到右求值并返回最右边的表达式或值。这相当于:
int getValue()
{
(void)2;
return 3;
}