3

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");
4

6 回答 6

9

代码的输出将是:

red

if语句的条件使用逗号运算符,它计算第二个操作数的结果,在本例中为:2。由于 C 中的非零类似于true,因此表达式为true,并且printf执行。

使用逗号运算符,计算第一个操作数并丢弃结果,然后计算第二个操作数,表达式的结果和类型是第二个操作数的计算结果和类型。在 wikipedia 上阅读有关逗号运算符的更多信息。

于 2012-09-27T18:46:50.713 回答
5

会打印red,不像

if (2,0)
    printf("red")

这不会打印任何内容。

这就是C中逗号运算符的工作方式——它一个一个地计算其操作数,并产生最后一个的结果作为其整体结果。

于 2012-09-27T18:46:30.930 回答
1

在您给出的上下文中,逗号运算符是无用的。

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

于 2012-09-27T19:05:02.643 回答
1

if语句中,如果控制表达式不为零,则执行该语句。

0, 2是一个逗号表达式,它的计算2结果是不为零的右操作数。

所以if表达式中的语句:

printf("red");

将在您的示例中执行。

于 2012-09-27T18:47:50.067 回答
0

要回答标题中的问题(来自C 2011 在线草案):

6.5 表达式

1表达式是一系列运算符和操作数,它们指定一个值的计算,或者指定一个对象或函数,或者产生副作用,或者执行它们的组合。运算符的操作数的值计算在运算符结果的值计算之前排序。

在片段中

if (0,2)
    printf("red");

0,2逗号表达式;每个子表达式02从左到右计算,逗号表达式的值是最右边的子表达式的值(在这种情况下,2)。由于 的结果0,2不为零,因此采用分支并printf执行语句。

请注意,逗号运算符与用于分隔函数中的参数的逗号不同:

foo(a, b, c);

在这种情况下,a, b, c参数列表,而不是逗号表达式。没有特定的评估顺序(c可以在a或之前评估b),也没有结果值。

于 2012-09-27T20:27:05.767 回答
0

它将打印red,因为逗号运算符评估第一个操作数并丢弃结果,然后评估第二个操作数并返回结果,因此它返回2哪个是TRUE值,因此进入 IF 块。

于 2012-09-27T18:49:33.553 回答