在表达式中使用逗号和在分配给可变
请解释的代码块:在表达式中使用逗号和在分配给可变
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);
}
逗号操作符返回第二个操作数的结果,并且操作者||
将短路。所以会发生什么在这种情况下是:
++a
评估,a
现在6
。由于(1)的结果不为零,因此评估
&&
的右侧。这意味着++b
,所以b
变为11
。(1)和(2)是逗号运算符的左侧,因此将丢弃
&&
的结果。 (这是1
,如果这对你很重要)。评估第一个
,
右侧的++a
。a
现在是7
。分配给
t
发生 -t
现在是7
,这是第一个逗号运算符的结果。所有这些都是另一个逗号运算符的左侧,所以结果(
7
)被丢弃。接下来++a
被评估。a
现在是8
。由于
a
不是0,因此||
短路和++c
未被评估。c
入住15
。
结果:t
是7
,a
是8
,b
是11
,和c
是15
。该printf
声明输出:
7 8 11 15
总体而言,这一代码将是更容易理解,如果你只是写道:
++a;
++b;
t = ++a;
++a;
其中具有完全相同的行为。
+1:第二个逗号运算符之前的任务是捕获人员的位置(当我第一次看到它时包括在内)。这正是为什么应该以真实代码避免这种构造的原因;他们是讨厌的,棘手的事情要阅读。有时候,可能有一些理由与更复杂的术语类似,但是......它可能隐藏在宏中,可能会更好地作为内联函数,并且仍然不太可能将同一变量增加3次。 –
我也是!如果我没有运行它来检查我的答案,我会自己弄错了。回想起来,我应该知道。例如,在'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
酷击穿!一个小的调整,但 - 分配发生在第二个逗号运算符的右侧进行评估。 –
@CarlNorum ..你是对的,Thanx为此。 –
没问题 - 看起来不错! –
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.
我误解了这个问题;我不认为这是我认为这是一个骗局的欺骗。 –
请解释这段代码 – kavi
请注意,有足够的序列点(在逗号运算符以及'&&'和'||'运算符处)代码不是未定义行为的常见情况(所以它是不是通常的'++ i + i ++'类型问题的结果是什么)。 –