【问题标题】:What's the precedence of comma operator inside conditional operator in C++?C++条件运算符中逗号运算符的优先级是什么?
【发布时间】:2012-08-21 14:20:03
【问题描述】:

这里发生了什么?

#include <iostream>
using namespace std;

int main(){

    int x=0,y=0;
    true? ++x, ++y : --x, --y; 
    cout << "x: " << x << endl;
    cout << "y: " << y << endl; //why does y=0 here?

    x=0,y=0;
    false ? ++x, ++y : --x, --y; 
    cout << "x: " << x << endl;
    cout << "y: " << y << endl;
}

x: 1
y: 0

x: -1
y: -1

第二种情况似乎很好。在第一种情况下,我希望 x 和 y 都递增到 1,但只有左侧操作数递增。

【问题讨论】:

  • 请提供实际编译的代码——否则我懒得帮你
  • @AdrianCornish 此代码编译;你试过了吗?
  • @chrisaycock 实际上没有。如果您添加 #include &lt;iostream&gt; 和 using std::cout; using std::endl; 可能会这样做
  • 是的。 OP 应该阅读 sscce.org,但在清晰度和细节方面仍然高于平均水平。
  • 在使用cout、#include &lt;iostream&gt; 和using namespace std; 的代码的问题中只是噪音。如果仅此而已,并且读者无法弄清楚如何编译它,那么他/她就没有资格回答 C++ 问题。

标签: c++ operator-precedence comma-operator


【解决方案1】:

第一个相当于:

(true  ? (++x, ++y) : (--x)), --y; 

第二个等价于:

(false ? (++x, ++y) : (--x)), --y; 

因此--y 总是被执行。在第一行中,首先执行增量,因此需要 x = 1, y = 0。在第二行中,x 的减量首先被执行,所以 x = -1, y = -1 是预期的。


正如Barmar 的评论(对另一个答案)所述:

如果有人想知道为什么++x 和++y 之间的逗号没有相同的效果,那是因为(true? ++x) 根本无效。所以编译器会一直扫描,直到找到:,但除此之外,它会在到达较低优先级的运算符[(在本例中为,)或语句结束]时停止。 p>

【讨论】:

  • 更准确地说明您的最后一段:运算符的优先级(和关联性)仅影响运算符左侧和右侧的操作数的绑定,而不影响中间的操作数。当然,三元运算符是唯一一个一开始就有中间操作数的运算符。但沿着这些思路,人们可能会将一对括号视为一元(恒等)运算符,其单个操作数位于中间(在“运算符符号”之间),这可以解释为什么它实现的分组不受任何优先规则的影响。
【解决方案2】:

阅读标准

§5.18 逗号运算符 [expr.comma]

¶1 逗号运算符从左到右分组。

expression:
assignment-expression
expression , assignment-expression

一对用逗号分隔的表达式从左到右计算;左边的表达式是一个废弃的值 表达式(第 5 条)。83 与左表达式相关的每个值计算和副作用 在与正确表达式相关的每个值计算和副作用之前排序。方式 结果的和值是右操作数的类型和值;结果是相同的值类别 作为它的右操作数,如果它的右操作数是一个左值和一个位域,则它是一个位域。

¶2 在逗号被赋予特殊含义的上下文中,[ 示例:在函数的参数列表中 (5.2.2) 和初始化器列表(8.5)-结束示例]第5条中描述的逗号运算符只能出现 在括号内。 [ 例子:

f(a, (t=3, t+2), c);

有三个参数,第二个的值为 5。--end example ]

【讨论】:

  • 谢谢。真的? (++x, ++y) : (--x, --y);固定的。教训:在意图不重要的地方总是使用括号。
  • @user1626720 - 更不用说“不要滥用三元运算符”。有问题的代码应该用 if ... else 编写,因为三元运算符的值被丢弃了。
【解决方案3】:

y 为零,因为逗号有the lowest precedence among all C++ operators。因为它的优先级低于三元条件运算符,所以条件运算符被解析为true? ++x, ++y : --x和false? ++x, ++y : --x。在这两种情况下,--y 语句都会无条件地执行。

EDIT 第一个逗号不同,因为编译器找到了?,所以现在需要一个: 来完成条件的“when true”表达式。这就是++x 和++y 都被收录的原因。

【讨论】:

  • 如果有人想知道为什么++x 和++y 之间的逗号没有相同的效果,那是因为(true? ++x) 根本无效。所以它会一直扫描,直到找到:,但除此之外,它会在到达较低优先级的运算符时停止。
  • 哦,永远不要这样做 if(x==100,000) 学会了艰难的方式;-)
猜你喜欢
  • 2020-08-22
  • 2017-10-13
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 2011-10-25
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多