请解释一下这段代码:
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);
}
请解释一下这段代码:
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) 是逗号运算符的左侧,因此&&
丢弃了 the 的结果。(1
如果这对你很重要的话)。
第++a
一个右侧的,
被评估。 a
现在是7
。
分配 tot
发生 -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;
它具有完全相同的行为。
执行 ->
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
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。