无法理解嵌套的三元运算符

时间:2014-01-23 09:12:21

标签: c ternary-operator

int main(void)
{
  int i = 10, j =20;
  j = i, j ?  (i, j) ? i : j : j;
  printf("%d %d", i, j);
  return 0;
}

输出是什么?

在这种情况下,请有人指导我如何解释嵌套的三元运算符。

2 个答案:

答案 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加上没有副作用的表达式。

相关问题