【问题标题】:Understand comma operator了解逗号运算符
【发布时间】:2016-03-13 07:09:55
【问题描述】:
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 的输出。

【问题讨论】:

  • 这就是所谓的“混淆”代码,即故意编写以混淆人们的代码。虽然它有时可以说明语言的晦涩方面,但不建议初学者使用,因为它可能会教给他们坏习惯,而且在大多数情况下,他们无法自己弄清楚。
  • 我投票决定将此问题作为题外话结束,因为混淆了对未来用户/访问者零使用或负面使用的垃圾代码。
  • @MartinJames;我不认为这段代码有零或负面的使用。
  • ^^^ 好的,那我们不同意:)

标签: c comma-operator


【解决方案1】:

三个声明中都使用了,

int a = (1,2,3);
int b = (++a, ++a, ++a);
int c = (b++, b++, b++);  

comma operator。它计算第一个操作数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.

在逗号运算符的情况下,从左到右保证1个求值顺序。

【讨论】:

  • " 它计算第一个操作数并丢弃它,然后计算第二个操作数并返回它的值。" -- 它计算所有操作数并返回最后一个:如果有第三个,它不会停在第二个。
  • @nicomp;没有第三个操作数!它是一个二元运算符。
  • (b++, b++, b++);是三个操作数,但我现在明白你的意思了。它是一系列二操作数操作。我的错。
  • @nicomp 实际上是((b++,b++),b++) 所以(b++,b++) 被认为是外逗号, 的一个操作数。
【解决方案2】:

代码一点都不好,头脑正常的人都不会编写它。你不应该花时间看那种代码,但我还是会给出解释。

逗号运算符, 的意思是“做左边的,丢弃任何结果,做右边的并返回结果。将部分放在括号中对功能没有任何影响。

代码写得更清楚:

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 的值不同。

【讨论】:

  • 这是一个糟糕的代码,但你应该花时间看看它,因为它会让你成为一个更好的编码器。保持好奇心并了解不该做什么是件好事。这与运动员在锻炼时拖着轮胎四处走动并穿着加重背心的原因相同:他们在练习中比在真正的比赛中更加努力。
  • 为什么在你的代码 sn-p 中使用 postincrement?
  • @ArmenTsirunyan 只是一种正常使用它的习惯,因为在这种形式下,前后增量无关紧要,它自然而然。它们也可以是预增量的。
  • @nicomp 没错,也许应该说不应该有目的地寻找这种代码。
  • @Sami Kuhmonen 寻找混淆代码既有趣又有教育意义。每年都有一个国际混淆 C 代码竞赛。 ioccc.org
【解决方案3】:

我是编程初学者。我不明白这个程序如何 显示我的输出

只需了解comma operatorsprefix ,postfix

根据提供给您的链接中提到的规则

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

【讨论】:

    猜你喜欢
    • 2010-10-04
    • 2017-07-11
    • 2010-12-16
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多