我已经参与了C编程很长一段时间了。 几天前,我偶然发现了错误编写的代码,这让我想到了以下问题。
以下C代码打印出来的内容。
if (0,2)
printf("red");
答案 0 :(得分:9)
代码的输出将是:
red
if
语句的条件使用逗号运算符,它计算第二个操作数的结果,在本例中为: 2 。由于C中的非零类似于 true ,因此表达式为 true ,printf
执行。
使用逗号运算符,计算第一个操作数并丢弃结果,然后计算第二个操作数,表达式的结果和类型是第二个操作数的计算结果和类型。阅读有关逗号运算符at wikipedia的更多信息。
答案 1 :(得分:5)
答案 2 :(得分:1)
在if
语句中,如果控制表达式不为零,则执行该语句。
0, 2
是一个逗号表达式,它的结果是右边的操作数2
不等于零。
所以if
表达式中的语句:
printf("red");
将在您的示例中执行。
答案 3 :(得分:1)
在您提供的上下文中,逗号运算符是无用的。
if (0,2)
printf("red");
在这种情况下,它说:
Do nothing with 0
if (2) //which is true
print "red"
基本上除非你想让最后一个值之前的对象有意义,否则它对你没有任何作用。一个略微更有用的例子,说明你为什么要这样做:
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递增答案 4 :(得分:0)
它将打印red
,因为comma operator计算第一个操作数并丢弃结果,然后计算第二个操作数并返回结果,因此它返回2
,这是TRUE
值因此进入IF块。
答案 5 :(得分:0)
回答标题中的问题(来自C 2011 online draft):
6.5表达式
1 表达式是一系列运算符和操作数,用于指定a的计算 值,或指定对象或功能,或产生副作用,或 执行它们的组合。运算符操作数的值计算 在运算符结果的值计算之前排序。
在摘录
中if (0,2)
printf("red");
0,2
是逗号表达式;每个子表达式0
和2
都是从左到右进行计算,逗号表达式的值是最右边的子表达式的值(在本例中为2
)。由于0,2
的结果不为零,因此将执行分支并执行printf
语句。
请注意,逗号运算符与用于分隔函数中的参数的逗号不同:
foo(a, b, c);
在这种情况下,a, b, c
是参数列表,而不是逗号表达式。没有特定的评估顺序(c
或a
之前可能会评估b
)并且没有结果值。