4

请解释一下这段代码:

void main()
{   
    int t,
        a = 5,
        b = 10,
        c = 15;  
    t = (++a && ++b, ++a), ++a || ++c;   // need explanation for this line
    printf("%d  %d  %d %d", t, a, b, c);
}
4

3 回答 3

8

逗号运算符返回其第二个操作数的结果,||运算符将短路。所以在这种情况下发生的是:

  1. ++a被评估,a是现在6

  2. 由于 (1) 的结果不为零,因此计算 的右侧&&。也就是说++b,就这样b变成了11

  3. (1) 和 (2) 是逗号运算符的左侧,因此&&丢弃了 the 的结果。(1如果这对你很重要的话)。

  4. ++a一个右侧的,被评估。 a现在是7

  5. 分配 tot发生 -t现在7是第一个逗号运算符的结果。

  6. 所有这些都是另一个逗号运算符的左侧,因此结果 ( 7) 被丢弃。接下来++a进行评估。 a现在是8

  7. 由于a不为 0,因此不评估||短路和。停留。++cc15

结果:t7a8b11c15printf语句输出:

7  8  11 15

总体而言,如果您只是这样编写,这段代码会更容易理解:

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

它具有完全相同的行为。

于 2013-06-05T05:29:28.140 回答
6

执行 ->

  t = (++a && ++b, ++a), ++a || ++c;  // () Priority
      ^
  t = (++a && ++b, ++a), ++a || ++c;  // ++a -> a = 6
        ^
  t = ( 6 && ++b, ++a), ++a || ++c;   // ++b -> b = 11
               ^
  t = ( 6 && 11 , ++a), ++a || ++c;   // 6 && 11 -> 1
           ^          
  t = ( 1 , ++a), ++a || ++c;         // ++a -> a = 7
            ^          
  t = ( 1 , 7), ++a || ++c;          // (1,7) -> 7 ... Comma operator has less priority 
          ^          
  t = 7, ++a || ++c;                //  (t = 7), ++a || ++c; ...Assigned value to t... Comma operator has less priority 
    ^
  ++a || ++c;                       // ++a -> a = 8
   ^          
  8 || ++c;                        //  8 || ++c -> 1 ...as 1 || exp -> 1...Logical OR skip next part if 1st exp is true  
    ^

最后->

t = 7
a = 8
b = 11
c = 15 
于 2013-06-05T05:40:28.830 回答
0
int t, a = 5, b = 10, c = 15;

在 C(和 C++)中,逗号运算符计算它的第一个操作数,丢弃它并计算它的第二个操作数并返回它。

++a && ++b 首先评估,a 现在是 6,b 现在是 11。

(++a && ++b, ++a)现在计算逗号 () 右侧的第二个操作数++a,a 现在是 7。此时 t 也被赋值为 7。这是因为赋值运算符的优先级高于逗号运算符

(++a && ++b, ++a), ++a now the second operand to the right of(++a && ++b, ++a) is evaluated. The third++a` 给出 a 的值为 8。

逻辑||运算符评估它的第一个操作数,如果是true,它不评估第二个操作数。第一个操作数(++a && ++b, ++a), ++a非零(真),因此不计算 ++c。c 的值保持在 15。

于 2013-06-05T05:50:32.347 回答