如果(a,b,c,d),这是如何工作的?

5
int main(void)
{
  int a=0, b=20;
  char x=1, y=10;
  if(a,b,x,y)
    printf("bye");
  return 0;
}

上面的代码中,“if”条件语句是如何工作的? “if”语句只会考虑“y”的值吗?

请阅读以下链接:https://dev59.com/UGMm5IYBdhLWcg3wMs7R#17785232。 - Grijesh Chauhan
4个回答

17

是的,逗号运算符的值是右操作数。因为其他操作数都没有副作用,所以可以简化为 if (y)


这是什么意思,如果a、b、c都是“false”,那么它还是会直接跳转到y吗? - Deepanshu Goyal
4
不,逗号运算符不会关心除了最后一个操作数之外的任何操作数的值。它们都会被评估并被丢弃,没有短路评估发生。 - unwind
很可能。如果你想使用其中一些或全部,可以使用&&||()一起使用。 - haneefmubarak
哦,不错....谢谢 @unwind - Deepanshu Goyal
@Deepanshu 如果你允许我在unwind的评论中加入一些精度,我会说他评论中最重要的部分是“它们都被评估”。在函数调用的情况下,所有调用都会被执行,然后只有最后一个调用的结果将用于测试(如果合适,即不是返回结构体的函数)。 - Bentoy13
诚然,我在这里省略了评估部分,因为它对结果没有影响,而且我不想让答案变得复杂。 - Joey

6

来自维基百科:

在C和C++编程语言中,逗号运算符(由标记,表示)是一个二元运算符,它评估其第一个操作数并丢弃结果,然后评估第二个操作数并返回此值(和类型)。

这实际上意味着只有最终操作数被评估为真实性,之前的操作数的结果将被丢弃。

if(a,b,x,y) 中,只考虑了 y 的真实性,因此无论 y 评估为什么,都会被认为是真/假。

在您的情况下,y 等于10,在C中被认为是 true,因此 if 检查也将评估为 true,并且将进入 if 块。

您可能想考虑 StackOverflow 上这个非常流行的问题,以了解它的用途(和误用)。


2
我想,一个应该因缺乏研究而被关闭的问题从维基百科得到答案是公平的。 - Jim Balter

4
逗号运算符(`,`)用于分隔表达式。如果多个值被括在圆括号中,则圆括号中的最后一个值被赋给变量。
e.g a=(x,y,z);
then  a=z;

while if,

a=x,y,z;

然后上面的表达式将被评估为(a=x);

请参考这里


1
逗号运算符的优先级最低。 - ajay
2
@YuHao 当然可以编译...它定义了a、y和z,初始化了a。不能编译的是int (a=x),y,z;,这使得答案是错误的。对于R.S.:逗号只是表达式中的运算符。(x,y,z)是一个初始化表达式,所以逗号在那里是一个运算符。但声明不是表达式,所以int (a=x),y,z;是无意义的,你的答案应该重新措辞。 - Jim Balter

0

正如Joey上面所说,这只是评估为无。

if (y)
    ....

需要注意的是,如果您的代码已经读取:

int main(void)
{
  int a=0, b=20;
  char x=1, y=10;
  if(a++,b++,x++,y)
    printf("%d, %d, %d, %d\n", a, b, (int)c, (int)y);
  return 0;
}

输出结果应该是这样的

1, 21, 2, 10

所有的增量都将被执行,但是为了评估条件而不执行。

(a++,b++,x++,y)

唯一重要的是最后一个,即y


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接