在表达式中使用逗号和在分配给可变

问题描述:

请解释的代码块:在表达式中使用逗号和在分配给可变

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

我误解了这个问题;我不认为这是我认为这是一个骗局的欺骗。 –

+0

请解释这段代码 – kavi

+2

请注意,有足够的序列点(在逗号运算符以及'&&'和'||'运算符处)代码不是未定义行为的常见情况(所以它是不是通常的'++ i + i ++'类型问题的结果是什么)。 –

逗号操作符返回第二个操作数的结果,并且操作者||将短路。所以会发生什么在这种情况下是:

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

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

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

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

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

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

  7. 由于a不是0,因此||短路和++c未被评估。 c入住15

结果:t7a8b11,和c15。该printf声明输出:

7 8 11 15 

总体而言,这一代码将是更容易理解,如果你只是写道:

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

其中具有完全相同的行为。

+2

+1:第二个逗号运算符之前的任务是捕获人员的位置(当我第一次看到它时包括在内)。这正是为什么应该以真实代码避免这种构造的原因;他们是讨厌的,棘手的事情要阅读。有时候,可能有一些理由与更复杂的术语类似,但是......它可能隐藏在宏中,可能会更好地作为内联函数,并且仍然不太可能将同一变量增加3次。 –

+0

我也是!如果我没有运行它来检查我的答案,我会自己弄错了。回想起来,我应该知道。例如,在'for'循环中使用逗号运算符以及赋值语句非常习惯。 –

执行 - >

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 
+1

酷击穿!一个小的调整,但 - 分配发生在第二个逗号运算符的右侧进行评估。 –

+0

@CarlNorum ..你是对的,Thanx为此。 –

+0

没问题 - 看起来不错! –

int t, a = 5, b = 10, c = 15; 

在C(和C++)的逗号运算它的第一个操作数,将其丢弃,并评估它的第二个操作数并返回它。

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

(++a && ++b, ++a)现在所述第二操作数的逗号(++a)的右边进行评价时,一个现在是7.在这点t被分配给值7 这是因为赋值运算符具有更高的优先级比逗号运算符

(++一个& & ++ B,++ a)中,一个++ now the second operand to the right of(++一个& & ++ B,++ A)is evaluated. The third ++ A`给出的值作为8

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