【发布时间】:2017-06-13 06:33:21
【问题描述】:
a+=b>=300?b=100:a==100;
如果a和b分别初始化为100和200,
执行三元运算符后a和b的值是多少?
答案是a=101、b=200。
这怎么可能?
【问题讨论】:
-
这是作业吗?只是好奇。
-
可能是作业,但问题不在于结果,而在于要求解释。
标签: c ternary-operator
a+=b>=300?b=100:a==100;
如果a和b分别初始化为100和200,
执行三元运算符后a和b的值是多少?
答案是a=101、b=200。
这怎么可能?
【问题讨论】:
标签: c ternary-operator
只需添加一些括号和空格以使其更具可读性,并且应该很明显:
a += ((b >= 300) ? (b = 100) : (a == 100));
(请参阅C operator precedence table,了解为什么括号可以放在上述表达式中的位置。)
所以这基本上只是:
a += 1;
【讨论】:
条件运算符与它无关,基本上它只是在这里增加了混乱。你的程序相当于a += a==100。这给出了a += 1,因为 == 的结果是布尔值 1=true。
【讨论】:
先加一些空格,让这个语句表达式更容易直观解析:
a += b >= 300 ? b = 100 : a == 100;
然后根据 C 语法(在这种特殊情况下与 java 或 javascript 语法略有不同)进行解析:
a +=
(b >= 300) ?
b = 100 :
a == 100
;
由于b = 200,测试b >= 300 评估为false,并且三元运算符的第一个分支不评估,但第二个分支是并且a == 100 评估为1 a 确实等于 100。三元运算符1 的结果被添加到a,因此a 的新值是101。 b 不变。
【讨论】: