0

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,即返回第二个值。这发生在两年前,从那时起一直在寻找正确的答案。

研究这个问题的答案,我知道它在评估后返回第二个值,但它对第一个值有什么作用?

我研究了堆栈的逻辑(如何在内部推送和弹出值),但我认为这与它没有任何关系。

它是处理这两个值还是做其他事情?

4

2 回答 2

4

引用C11标准,第 6.5.17 章,逗号运算符

逗号运算符的左操作数被评估为 void 表达式;在它的求值和右操作数的求值之间有一个序列点。然后对右操作数求值;结果有它的类型和值。

现在来回答你的问题

它与第一个有什么关系?

我们可以说,第一个操作数(左手操作数)被评估,结果被丢弃

注意:我提到了结果,而不是效果

只是为了澄清一下,在您的情况下,您不会注意到效果,但是如果左右手表达式都与同一个变量相关,您会注意到它的效果。例如,让我们讨论一个简单的例子

return p=3, p+2;

我们可以像这样分解return语句

  • 3为变量[ 的左侧运算符]赋值p ,
  • 执行p+2,ehich 生成 的值5[ 的右侧运算符,]
  • return5作为第二个参数的值的值[在子句之后:“(,运算符的)结果具有其(右操作数的评估)类型和值。”]

观看现场演示

于 2015-05-26T08:58:12.717 回答
2

逗号运算符将从左到右计算并返回最右边的表达式或值。这相当于:

int getValue()
{
    (void)2;
    return 3;
}
于 2015-05-26T08:58:04.160 回答