与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]

Posted

技术标签:

【中文标题】与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]【英文标题】:Comma operator precedence while used with ? : operator [duplicate] 【发布时间】:2013-05-27 01:57:24 【问题描述】:

我不知道为什么下面两个子程序的结果不同:

    int a , b;

    a = 13, b=12;
    (a > b)? (a++,b--):(a--,b++); // Now a is 14 and b is 11

    a = 13, b=12;
    (a > b)? a++,b-- : a--,b++;   // Now a is 14 but b is 12

但是对于这些情况,结果是相同的:

    a = 13, b=12;
    (a < b) ? a++,b-- : a--,b++; // Now a is 12 and b is 13

    a = 13, b=12;
    (a < b) ? (a++,b--) : (a--,b++); // Again a is 12 and b is 13

为什么括号对"?" 之后的语句有区别,而对":" 之后的语句没有区别?你有什么想法吗?

【问题讨论】:

不以这种方式使用逗号的另一个原因。 【参考方案1】:

这个:

(a > b)? a++,b-- : a--,b++; 

相当于:

((a > b) ? (a++, b--) : a--), b++;

所以b 总是递增,只是有时递减。没有办法解析?: 之间的逗号运算符,除非在“等价于”表达式中加上括号。但是在: 之后,不带括号的逗号终止了三元?: 运算符并将增量保留为无条件执行。逗号运算符的优先级非常非常低。

【讨论】:

【参考方案2】:

在这种情况下

(a > b)? a++,b-- : a--,b++; 

相当于

((a > b)? a++,b-- : a--),b++; 

【讨论】:

【参考方案3】:

我猜这是因为x ? y 不能被认为是一个有效的表达式,因此逗号不能在那里分割运算符。 x ? y : z 是一个有效的表达式,冒号后面的逗号可以拆分成两个表达式。

【讨论】:

【参考方案4】:

C++语法的相关部分是:

conditional-expression:
    logical-or-expression
    logical-or-expression ? expression : assignment-expression
assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator assignment-expression
    throw-expression
expression:
    assignment-expression
    expression, assignment-expression

总而言之,虽然条件表达式的“中间”可以是一个完整的表达式,直到 :,最后一个子表达式只能是一个排除表达式的 assignment-expression使用逗号运算符(除了逗号运算符作为 assignment-expression 的有效子表达式的一部分出现的情况,例如带括号的 primary-expression 或作为第二个操作数另一个条件表达式)。

在 C 中,最后一个子表达式受到更多限制,它甚至不能是赋值表达式,尽管在您的示例中这不是问题。

conditional-expression:
    logical-OR-expression
    logical-OR-expression ? expression : conditional-expression

【讨论】:

这必须来自 C++ 标准,因为 'throw-expression' 不是 C 的一部分。但是,问题是双重标记的,所以它是有效的。 @JonathanLeffler:是的。 C 和 C++ 条件运算符语法之间存在重要差异;我正在浏览 C++ 问题,但没有注意到 C 标记。

以上是关于与 ? 一起使用时的逗号运算符优先级: 运算符 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

逗号运算符如何与 C++ 中的 cout 一起使用?

为啥 return 0 或 break 不能与逗号运算符一起使用?

连接相邻字符串文字时的 Python 运算符优先级

将 != 运算符与 || 一起使用时的困惑JavaScript 中的运算符

C语言逗号表达式问题?

将ngrx效果与withLatestFrom运算符一起使用时的奇怪行为