倒底是什么运算顺序?

zxlxg 2003-10-09 05:34:35
Turbo C中,当i=5时,(i++)+(i++)+(i++)结果为5+5+5=15,而(++i)+(++i)+(++i)结果为8+8+8=24,好象是扫描整个式子后再作判断,先加的加完再运算,后加的运算完再加上1.那为什么a=0;b=2;c=2;d=a||b+c--&b-c;d的结果为1;却是在表达式的一半就运行了c--了呢?请从理论上分析!

...全文
77 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
nanfang1983 2003-10-15
  • 打赏
  • 举报
回复
本来就应该先算c--
Fuzzier 2003-10-12
  • 打赏
  • 举报
回复
估计除了考试,没有人会这样写程序,说不定到最后自己都弄不明白了。

++X表示表达式之前,就加。
X++表示表达式之后,再加。

于是可以这样翻译:
(i++)+(i++)+(i++):表达式为i+i+i,之后再加三次。
(++i)+(++i)+(++i):先加三次,表达式为i+i+i。
zxlxg 2003-10-12
  • 打赏
  • 举报
回复
是不是&&与||运算符是分两步运算的,先运算前半步,并执行了c--运算后,根据前半部结果再判断是否执行后半部。分两步(当然如有多个符号就是多步)扫描、也分两步运算,这样似乎才能解释上面的两个式子。谁有理论上的根据?
zxlxg 2003-10-11
  • 打赏
  • 举报
回复
请教wingfiring(别逗了) :
“ 如果是这样:
d=a||b+c--&&b-c
那么结果将是可以预测的,是确定的。”
怎么可预测的,这个式子的运行结果是1,先运算“b+c--&&b-c",这个式子并没”短路“,难道在求完b+c后就执行了c--了吗?为什么不在整个式子求完后再c--呢?
同一个Turbo c编译器,这与“当i=5时,(i++)+(i++)+(i++)结果为5+5+5=15,而(++i)+(++i)+(++i)结果为8+8+8=24”的结论完全不同,是何道理?
fangrk 2003-10-11
  • 打赏
  • 举报
回复
的确无聊
wingfiring 2003-10-11
  • 打赏
  • 举报
回复
楼上的b+c--&&b-c这个式子是复合表达式,如果表达式b+c--结果不是0(不是false),再计算b-c.这个顺序是C++标准要求的。
至于为什么要这样,只要理解一下逻辑运算就知道了:
对于&&,0和任何数&&,结果总是0,所以,如果计算出左边表达式是0,就不必再计算右边的了。
类似的,1和任何数||,结果总是1。

至于你的Turbo c编译器问题,这个结果完全是依赖于实现的,没任何理由。你只有避免发生这种情况。
kdush 2003-10-10
  • 打赏
  • 举报
回复
这又是道作业题吧!!!!!!
晕死!!!!!!!!
应试教育的悲哀呀!!!!!!!
leyt 2003-10-10
  • 打赏
  • 举报
回复
取决于编译器
catface 2003-10-10
  • 打赏
  • 举报
回复
取决于编译器 没固定答案
记得我问这个问题的时候 别人只是回答我 回字的几中写法
程序里 应当避免这样的情况的出现
liao2001 2003-10-10
  • 打赏
  • 举报
回复
我怎么会说“又”?
liao2001 2003-10-10
  • 打赏
  • 举报
回复
又来了。。。
likangnian0128 2003-10-10
  • 打赏
  • 举报
回复
d=a||b+c--&b-c;结果是1阿?

计算顺序确实应该是先计算 a||b + c&b -c,然后再c--
但是a||b = 0 || 2 = 1
c&b = 2 & 2 = 2
c = 2
所以 a||b + c&b - c = 1,没有错的。
wingfiring 2003-10-10
  • 打赏
  • 举报
回复
靠!
这C++有规定的。

对于&&和||运算符,又叫'短路运算符',而且,C++严格定义了运算符两侧表达式的求值顺序。
例如:
expr1 && expr2
如果expr1为false,那么,expr2是不会求值的(被短路了)。
举例来说 i = 0; i++ && i++;的i最后值是1。而++i && ++i的i最后值是2.
这里的差别就在于i++ && i++的后面一个表达式根本就不会执行。
类似的i++ || i++;i最后值是2,++i || ++i;i最后值是1,因为前一个表达式的值是1,不用计算后一个表达式。
作为对比,看看逗号表达式的结果:
i++ ,i++;和++i ,++i;执行以后,i的值都是2。

C++规定,在一个复合表达式当中,除了&&和||必须是从左到右计算外,对其它任何表达式的求值顺序都是未定义的,目的是为了给编译器优化留下足够的自由。
看这个语句:
i = 0;
j = i++, ++i, i++, ++i;
这里用了逗号表达式,最后的结果j是多少?这是没有定义的,不同的编译器完全可能给出不同的结果。
很可能的一个结果是4,也可能是1。即使对于特定的编译器来说,这个结果也可能是不确定的:改变优化选项可能导致不同的结果。

导致这一问题的根本原因在于表达式的副作用影响到了表达式计算本身。

对于楼主的表达式
d=a||b+c--&b-c
中的c的两个出现,没有严格的分列在||或者是&&的两边,所以这个结果只是巧合,这样的写法是错误的。
如果是这样:
d=a||b+c--&&b-c
那么结果将是可以预测的,是确定的。
zxlxg 2003-10-10
  • 打赏
  • 举报
回复
不好意思,我正是在应付考试,也想从理论上搞清这个原理。Andy84920先生说的<<C陷阱与缺陷>>电子版哪里有下载呢?请明示。
cnxiaohai 2003-10-10
  • 打赏
  • 举报
回复
又是一个为了考试的编程者

I++ ++I这样的东西是方便



不能象有的考试辅导书上那样用

他和编译器有关

所以,懂一点的人出题目一般也不会碰

我们一般叫这种题目是"洗脑子"
lp1983 2003-10-10
  • 打赏
  • 举报
回复
++i是先加后用,i++是先用后加.先别管逻辑运算 ,编译器, 没固定答案 ,取决于编译器
nanfang1983 2003-10-10
  • 打赏
  • 举报
回复
加一个括号不就行了
compboy1 2003-10-09
  • 打赏
  • 举报
回复
这类问题确实很无聊,可也很有趣!
thb28 2003-10-09
  • 打赏
  • 举报
回复
与编译器有关!!!!!!!!!
c4313848 2003-10-09
  • 打赏
  • 举报
回复
我看一般不会有人写代码时用这个的
加载更多回复(12)

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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