请解释这段代码:
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);
}
答案 0 :(得分:8)
逗号运算符返回其第二个操作数的结果,||
运算符将短路。那么在这种情况下会发生什么:
++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
为{{} 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。