理解逗号运算符

6
int main()
{
    int a = (1,2,3);
    int b = (++a, ++a, ++a);
    int c= (b++, b++, b++);
    printf("%d %d %d", a,b,c);
}

我是一个编程初学者。我不明白这个程序如何输出6 9 8


1
这是所谓的“混淆”代码,即故意编写以迷惑人的代码。虽然它有时可以说明语言中晦涩的方面,但不建议初学者使用,因为它可能会教他们坏习惯,并且在大多数情况下,他们自己无法弄清楚它。 - Tom Karzes
我投票关闭此问题,因为混淆的垃圾代码对未来的用户/访问者毫无用处或负面影响。 - Martin James
1
@MartinJames; 我认为这段代码没有零或负面的用途。 - haccks
好的,那我们意见不一致 :) - Martin James
同学?http://stackoverflow.com/questions/34155644/execution-of-parameters-in-printf-function-in-c-programming-language - Mogsdad
3个回答

8
在所有三个声明中使用的,,表示分隔不同的值。
int a = (1,2,3);
int b = (++a, ++a, ++a);
int c = (b++, b++, b++);  

是一个逗号运算符。它评估第一个操作数1并丢弃它,然后评估第二个操作数并返回其值。因此,

int a = ((1,2), 3);          // a is initialized with 3.
int b = ((++a, ++a), ++a);   // b is initialized with 4+1+1 = 6. 
                             // a is 6 by the end of the statement
int c = ((b++, b++), b++);   // c is initialized with 6+1+1 = 8
                             // b is 9 by the end of the statement.

如果使用逗号运算符,表达式的求值顺序从左到右保证。


它评估第一个操作数并将其丢弃,然后评估第二个操作数并返回其值。它评估所有操作数并返回最后一个:如果有第三个操作数,它不会在第二个操作数处停止。 - nicomp
@nicomp; 没有第三个操作数!它是一个二元运算符。 - haccks
(b++, b++, b++);这是三个操作数,但我现在明白你的意思了。它是一系列的双操作数操作。我的错误。 - nicomp
1
@nicomp 实际上是 ((b++,b++),b++),因此(b++,b++)被视为外部逗号,的一个操作数。 - ameyCU

5

这段代码并不好,任何理智的人都不会去编写它。你不应该花时间看这种代码,但我仍然会给出解释。

逗号操作符,表示“执行左侧操作,丢弃任何结果,执行右侧操作并返回结果”。将这些部分放在括号中对功能没有影响。

更清晰地写出来,代码应该是:

int a, b, c;

a = 3; // 1 and 2 have no meaning whatsoever

a++;
a++;
a++;
b = a;

b++;
b++;
c = b;
b++;

前置和后置递增运算符在行为上有所不同,这导致了b和c的值的差异。


2
这是糟糕的代码,但你应该花时间去看它,因为它会让你成为更好的程序员。好奇心和学习什么不该做是很好的。这就像运动员在训练时拖着轮胎、穿着加重背心一样:他们在训练中比在真正的比赛中更努力。 - nicomp
2
你的代码片段中为什么使用了后置递增运算符? - Armen Tsirunyan
@ArmenTsirunyan 这只是我平常使用的一种习惯,由于在这种形式中后增量和前增量没有区别,所以自然而然地使用它。它们也可以是前增量。 - Sami Kuhmonen
@nicomp 对,也许应该说不应该刻意去寻找这种类型的代码。 - Sami Kuhmonen
1
@Sami Kuhmonen 寻找混淆代码是有趣且富有教育意义的。每年都会举办国际混淆 C 代码大赛。http://ioccc.org/ - nicomp
显示剩余3条评论

1

我是编程新手。我不明白这个程序如何输出结果

只需理解逗号运算符前缀,后缀即可。

根据给你提供的链接中的规则。

int a = (1,2,3);          // a is initialized with 3 last argument .
int b = (++a, ++a, ++a);  // a is incremented three time so becomes 6 and b initilized with 6 . 
int c = (b++, b++, b++);  // b incremented two times becomes 8  and c initialized with  8.
                          // b incremented once more time becomes 9

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