Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法理解嵌套的三元运算符_C_Ternary Operator - Fatal编程技术网

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

C 无法理解嵌套的三元运算符,c,ternary-operator,C,Ternary Operator,输出是什么 在这种情况下,请有人指导我如何解释嵌套的三元运算符。这里的代码希望是您已经阅读并想要删除的代码,而不是您实际使用的代码 您有两个未设置的ternay运算符和两个逗号运算符的组合 尽管没有使用括号,但?:的嵌套是明确的: int main(void) { int i = 10, j =20; j = i, j ? (i, j) ? i : j : j; printf("%d %d", i, j); return 0; } 只能意味着 a ? b ? c : d :

输出是什么


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

这里的代码希望是您已经阅读并想要删除的代码,而不是您实际使用的代码

您有两个未设置的ternay运算符和两个逗号运算符的组合

尽管没有使用括号,但?:的嵌套是明确的:

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

a ? b ? c : d : e
因为没有其他的解释方法

第二个逗号运算符在括号中,因此它也是明确的

唯一值得怀疑的是开头的逗号运算符,在这里您可能需要查阅优先级表

这里我们看到,它的优先级最低,因此我们有

a ? ( b ? c : d) : e
它是一个逗号运算符,赋值作为第一个表达式,未赋值的另一个表达式作为第二个表达式,这是结果

简言之,如果我们省略了右侧,尽管没有使用,我们只有j=i,但是这个表达式缺乏可读性

所以输出是10


很好的陷阱,这个表达。。。但正如书中所写,答案并不包括这一点。如果我错误地把它估计为j=j?i:j;我也会得到10分。

C是由语言语法定义的;优先表是一种方便的语法压缩工具,人们可以一眼就能理解,但它并不完全符合语法的规定

您可能需要参考语言语法来解析三元运算符周围的关联性。就我个人而言,我总是明确地使用括号,这样一个不是语言律师的读者仍然可以理解正在发生的事情,这样我就不会犯错误

例如:

(j = i), (j ?  (i, j) ? i : j : j);
必须将其解析为

c ? c = a : c = b
这在C中是非法的,因为三元运算符没有给出左值。顺便说一下,C++语法不同;在该语言中,这被解析为

(c ? c = a : c) = b
这是合法的;并且三元算子可以在C++中给出一个L/VP. 在您的情况下,问题是以下哪项:

c ? c = a : (c = b)

我相信后者在这里是正确的,所以你应该得到j=I加上一个没有副作用的表达式

使用运算符优先级表来解决这个问题。如果你继续做奇怪的事情,每个人都会恨你。-3?!使用这样一个操作符是不好的,但不要问它。我也会感到困惑。@glglgl:我一眼就看不懂,我一时记不起优先顺序;我的抱怨更多的是,键入一些随机代码,然后将其发布,因此不是特别有建设性…@VinayakPingale如果这是一个面试问题,那么你知道你不想要这份工作…只是想说,尽管你的建议编辑不幸被拒绝,但你绝对正确。所以我做了编辑并把它归因于你。谢谢
Z = ((i , j) ? X : Y)
Z = (i , (j ? X : Y))
(Z = i, j) ? X : Y
(Z = i), (j ? X : Y)