int main(void)
{
int i = 10, j =20;
j = i, j ? (i, j) ? i : j : j;
printf("%d %d", i, j);
return 0;
}
输出是什么?
在这种情况下,请有人指导我如何解释嵌套的三元运算符。
答案 0 :(得分:3)
这里有你希望得到的代码,你想要摆脱,而不是你实际使用的代码。
您有两个未加掩盖的ternay运算符和逗号运算符的两种用法的组合。
尽管没有使用括号,但?:
的嵌套是明确的:
a ? b ? c : d : e
只能意味着
a ? ( b ? c : d) : e
因为没有其他方法可以解释它。
第二个逗号运算符在括号中,所以它也是明确的。
唯一的疑问是开头的逗号运算符,您可能需要查询优先级表。
在这里,我们看到,
具有最低优先级,因此我们有
(j = i), (j ? (i, j) ? i : j : j);
这是一个逗号运算符,其赋值为第一个表达式,未评估的其他表达式为第二个表达式,这是结果。
简而言之,如果我们省略右侧(虽然没有使用),我们只有j = i
,但这个表达式缺乏不可读性。
因此输出为10 10
。
伟大的陷阱,这个表达......但正如所写的那样,答案并没有涵盖这一点。如果我错误地将其评估为j = j ? i : j;
,我也会得到10 10
。
答案 1 :(得分:3)
C由语言语法定义;优先表是将语法简化为人类可以一目了然的内容,但它并不完全符合语法指定的内容。
您可能需要参考语言语法以解决三元运算符周围的关联性。就个人而言,我总是明确地使用括号,这样一个不是语言律师的读者仍然可以理解正在发生的事情(这样我就不会犯错误。)
一个例子是:
c ? c = a : c = b
必须解析为
(c ? c = a : c) = b
在C中是非法的,因为三元运算符不给出左值。顺便说一句,C ++语法是不同的;在该语言中,这被解析为
c ? c = a : (c = b)
这是合法的;并且三元运算符也可以用C ++给出左值。
在您的情况下,问题是以下哪一项:
Z = ((i , j) ? X : Y)
Z = (i , (j ? X : Y))
(Z = i, j) ? X : Y
(Z = i), (j ? X : Y)
我相信后者在这里是正确的,所以你应该最后得到j = i
加上没有副作用的表达式。