在表达式中使用逗号并将其分配给变量

时间:2013-06-05 05:18:18

标签: c

请解释这段代码:

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);
}

3 个答案:

答案 0 :(得分:8)

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

    评估了
  1. ++aa现在为6

  2. 由于(1)的结果不为零,因此评估&&的右侧。这意味着++b,因此b变为11

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

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

  5. t的作业发生了 - t现在是7,是第一个逗号运算符的结果。

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

  7. 由于a不为0,因此||短路和++c未被评估。 c保留15

  8. 结果:t7a8b11c为{{} 1}}。 15语句输出:

    printf

    总的来说,如果你刚写了这个代码会更容易理解:

    7  8  11 15
    

    具有完全相同的行为。

答案 1 :(得分: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 

答案 2 :(得分: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`给出的值为8。

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