社区
C语言
帖子详情
倒底是什么运算顺序?
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
打赏
收藏
倒底是什么运算顺序?
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--了呢?请从理论上分析!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
JavaSE案例--四连棋游戏--位
运算
传统的四连棋算法,使用的是两维数组的方式,... 这套视频,采用位
运算
,& | << |= 等进行四连棋的游戏开发,
运算
性能非常快。 这是位
运算
使用的经典案例!(本套视频只提供算法分析代码,不提供项目演示代码)
什么是算术
运算
?什么是关系
运算
?什么是逻辑
运算
?
算术
运算
算术
运算
:用于各类数值
运算
.包括加(+)、减(-)、乘(*)、除(/)、求余(或称模
运算
,%)、自增(++)、自减(–)共七种. 算术
运算
简称
运算
。 指按照规定的法则和
顺序
对式题或算式进行
运算
,并求出结果的过程。包括:加法、减法、乘法、除法、乘方、开方等几种
运算
形式。 其中加减为一级
运算
,乘除为二级
运算
,乘方、开方为三级
运算
。在一道算式中,如果有几级
运算
存在,则应先进行高级
运算
,再进行...
2021-06-29 复合赋值
运算
的计算
顺序
c =10 c += 1 +2 print© d = 10 d *= 1 + 2 print(d) output: 13 30 从上面两例来看,先计算复合赋值
运算
右边的
运算
表达式,再计算复合赋值
运算
。
c语言中表达式的
运算
顺序
c语言中表达式的
运算
顺序
由优先级和结合性决定。 1.先按
运算
符优先级
运算
。2.如果相邻若干个
运算
符优先级相同,则按结合方向来
运算
。 比如:1+2-3*4的
运算
为:有优先级先做*
运算
,3*4得到12;表达式为1+2-12,算数
运算
符为从左到右的结合方向,即先做+
运算
,再做-
运算
。 下面是c语言
运算
符的优先级和结合性: 优先级
运算
符 名称或含义
c语言表达式的
运算
顺序
C语言中表达式的
运算
顺序
由优先级和结合性决定。 1.先按
运算
符优先级
运算
。2.如果相邻若干个
运算
符优先级相同,则按结合方向来
运算
。 比如:1+2-3*4的
运算
为:有优先级先做*
运算
,3*4得到12;表达式为1+2-12,算数
运算
符为从左到右的结合方向,即先做+
运算
,再做-
运算
。 下面是c语言
运算
符的优先级和结合性: 优先级
运算
符
C语言
69,381
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章