条件运算符(?:)的问题

for37 2007-03-05 11:50:23
根据c++语法,条件运算符(?:)的优先级高于赋值运算符(=)
对于以下表达式:
1) x=y>z?y:z
2) y>z?y:z=x
如果用括号体现其运算顺序,括号应放在哪呢?
第一个是没有争议的:x=(y>z?y:z)
那第二个呢?
按我的理解,应是:(y>z?y:z)=x
很多人可能认为表达式(y>z?y:z)=x有语法错误,我要说明两点:
第一:该表达式没有语法错误(你可以尝试编译)
第二:即使有语法错误,编译器也不会改变词法分析以避免之
所以这里只讨论执行顺序,而不管是否有语法错误

但非常遗憾,编译器认为是:y>z?y:(z=x)
我非常不解,如果是:y>z?y:z+x,那么应该是:y>z?y:(z+x),因为加号(+)优先级高于条件运算符,但赋值运算符是低于条件运算符的啊!
请个各位指点
...全文
325 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
h9999h 2007-03-06
  • 打赏
  • 举报
回复
条件表达式预算符的优先级比较低,仅高于=, *=、-=系列,throw, 逗号序列。

所以y>z?y:z=x,运行顺序 ( y>z ) ? ( y ) : ( z = x )

对 条件表达式 expr1 ? expr2 : expr3,
如果 expr1 为true, expr3就不再计算了,所以楼上的 b值不变。
a也不变,条件表达式 最后赋值得是 ( a< b) 的结果产生的临时变量。a本身不变的。

你把a = 9,这样大于b,则b最后的值会改变
taodm 2007-03-06
  • 打赏
  • 举报
回复
b=c根本就在false分支,当然没有执行。
wuyu1 2007-03-06
  • 打赏
  • 举报
回复
强烈支持老鲁 这些牛角问题不应该被讨论 打个括号 什么问题都可以解决 我门老师就是这么对我门说的 这和孔已己的4个回字没什么区别
277894613 2007-03-05
  • 打赏
  • 举报
回复
同意edutl(老鲁)
edutl 2007-03-05
  • 打赏
  • 举报
回复
站在专业的程序员的角度来讲,不应该过分依赖编译器的自动化,在逻辑复杂或令人费解的代码部分,良好的编码风格应该是更多的用括号来表述逻辑运算关系,以免出现不可预知的后果和后期维护困难。
Dugowe 2007-03-05
  • 打赏
  • 举报
回复
y>z?y:z=x
条件表达式的一般形式是:

表达式1 ? 表达式2 : 表达式3


这样的话,系统应该是把z = x作为表达式3了....不管 = 优先级如何,只是表达式3中的运算符号,
不只这样的解释是否合理,呵呵
taodm 2007-03-05
  • 打赏
  • 举报
回复
考虑一下y>z?y=x:z;它和y>z?y:z=x;对称的。
看一下C++关于?:的语法的BNF描述吧:
conditional-expression:
logicla-or-expression
logical-or-expression ? expression : assignment-expression
FingerStyle 2007-03-05
  • 打赏
  • 举报
回复
mark..
for37 2007-03-05
  • 打赏
  • 举报
回复
#include<iostream>
#include<conio.h>
using namespace std;
int main()
{
int a=5,b=7,c=3;
cout<<(a<b?a:b=c)<<endl;
cout<<a<<' '<<b<<' '<<c;
getch();
}


结果:
5
5 7 3
c的值赋到哪里了?怎么a,b的值都没变啊?
for37 2007-03-05
  • 打赏
  • 举报
回复
可读性很重要,我知道
这里只就事论事,为什么运算顺序会是这样的?
blueoceanli 2007-03-05
  • 打赏
  • 举报
回复
写程序要简单化....................
易懂,易读

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧