I have been involved in C programming for quite some time now. A few days back, I stumbled upon a wrongly written code, which let me to the following question.
What would the following C code print out.
if (0,2)
printf("red");
I have been involved in C programming for quite some time now. A few days back, I stumbled upon a wrongly written code, which let me to the following question.
What would the following C code print out.
if (0,2)
printf("red");
代码的输出将是:
red
该if
语句的条件使用逗号运算符,它计算第二个操作数的结果,在本例中为:2。由于 C 中的非零类似于true,因此表达式为true,并且printf
执行。
使用逗号运算符,计算第一个操作数并丢弃结果,然后计算第二个操作数,表达式的结果和类型是第二个操作数的计算结果和类型。在 wikipedia 上阅读有关逗号运算符的更多信息。
在您给出的上下文中,逗号运算符是无用的。
if (0,2)
printf("red");
在这种情况下,它说:
Do nothing with 0
if (2) //which is true
print "red"
基本上它对你没有任何作用,除非你希望最后一个值之前的 opp(s) 有意义。一个稍微有用的例子说明你为什么想要这个:
int i, j;
int arr[4] = {1,2,3,4};
for(i=0, j=1; i<4; j+=2, i+=2){
printf("arr[%d] = %d\n", i, arr[i]);
printf("arr[%d] = %d\n", j, arr[j]);
}
现在这个循环只有 2 次迭代,我们打印出数组中的所有 4 个值:
arr[0] = 1
arr[1] = 2
arr[2] = 3
arr[3] = 4
它在那里也有两个以上的操作,所以如果你愿意,你可以这样做:
if(a++, b++, 1)
printf("red");
现在您将在打印“红色”时增加 a 和 b
在if
语句中,如果控制表达式不为零,则执行该语句。
0, 2
是一个逗号表达式,它的计算2
结果是不为零的右操作数。
所以if
表达式中的语句:
printf("red");
将在您的示例中执行。
要回答标题中的问题(来自C 2011 在线草案):
6.5 表达式
1表达式是一系列运算符和操作数,它们指定一个值的计算,或者指定一个对象或函数,或者产生副作用,或者执行它们的组合。运算符的操作数的值计算在运算符结果的值计算之前排序。
在片段中
if (0,2)
printf("red");
0,2
是逗号表达式;每个子表达式0
和2
从左到右计算,逗号表达式的值是最右边的子表达式的值(在这种情况下,2
)。由于 的结果0,2
不为零,因此采用分支并printf
执行语句。
请注意,逗号运算符与用于分隔函数中的参数的逗号不同:
foo(a, b, c);
在这种情况下,a, b, c
是参数列表,而不是逗号表达式。没有特定的评估顺序(c
可以在a
或之前评估b
),也没有结果值。
它将打印red
,因为逗号运算符评估第一个操作数并丢弃结果,然后评估第二个操作数并返回结果,因此它返回2
哪个是TRUE
值,因此进入 IF 块。