运算符优先级问题:(i++)+(i++)
# include <stdio.h>
#include <math.h>
main(){
int i=3;
int y=0;
int z=0;
y=(i++)+(i++);
printf("y=%d\n",y);
i=3;
z=(i++)+(++i);
printf("z=%d\n",z);
}
VC6.0的编译结果
y=6
z=8
__________________________________________________
那个高人给分析分析
问题点数:100、回复次数:23Top
1 楼yjh1982(血精灵)回复于 2004-12-02 16:59:32 得分 0
没有解释,不同编译器不同实现,不必研究这个Top
2 楼ingot(九儿)回复于 2004-12-02 17:00:36 得分 0
i++ 是先执行 y = i + i;这句,再执行i += 1
++i 是先执行i += 1 ,在执行 z = i + i;Top
3 楼carylin(林石)回复于 2004-12-02 17:03:32 得分 10
新的c標準規定,一個錶達式中,若有前加式(如:++i),那么整個錶達式隻做一次自加,並返囬自加后的值。若沒有前加式而隻有后加式(如:i++),那么整個錶達式隻做一次自加,返囬自加前的值。Top
4 楼pacman2000(pacman)(影子传说)回复于 2004-12-02 17:05:53 得分 0
不用看这样的题目,不同编译器结果不同。Top
5 楼carylin(林石)回复于 2004-12-02 17:10:48 得分 10
說錯暸:
新的c標準規定,一個錶達式中,若有多個前加式(如:++i),那么整個錶達式做多次自加,並以最后一次自加后的值參與運算。若沒有前加式而隻有后加式(如:i++),那么整個錶達式做多次自加,整個錶達式隻以原值參與遠算。Top
6 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-12-02 17:13:15 得分 0
许多编译器都或多或少的跟不上标准:)Top
7 楼muzhi(木子)回复于 2004-12-02 17:20:56 得分 0
如果就c++而言这是因为标准所定向前面诸君说的
可是在别的语言中会有不同的结果Top
8 楼kobefly(科比--网络学习中)回复于 2004-12-02 17:21:05 得分 0
carylin(别信我,我在说谎)
又见到你了啊
哈哈
严重支持你的发言Top
9 楼steedhorse(晨星)回复于 2004-12-02 17:31:35 得分 0
上帝啊,别让你的子民讨论这个问题啦。。。。Top
10 楼wwxsoft(婉儿)回复于 2004-12-02 17:31:50 得分 10
devc++编译得结果也是 6,8
i++ 是先执行 y = i + i;这句,再执行i += 1
++i 是先执行i += 1 ,在执行 z = i + i;
Top
11 楼tsingien(Read The F**king Source Code)回复于 2004-12-02 17:34:54 得分 10
谭老师的学生吗?Top
12 楼LBN1012(星空)回复于 2004-12-02 17:36:52 得分 10
y=(i++)+(i++);
z=(i++)+(++i);
我用TC++3.0编译了(这个编译器应该不是新标准),结果和你的一样。
我是这样认为的,可能编译器在编译表达式的时候是从右到左编译的,第一句由于是i++,先使用了i再执行自加,所以和左右没关系。但第二句先执行后面括号里面的++i,所以z的值是两个4相加,然后i还有自加1,i最后的值是5。
(仅仅是我个人的看法,希望有高手出来解释一下)
Top
13 楼bobob(静思)回复于 2004-12-02 17:46:11 得分 10
这个放在哪个环境底下的结果都一样,没有歧异(除非不支持标准)
spec规定i++就是在i参加完了运算再加1
最后i的值是5Top
14 楼sunshangjun(守望永久)回复于 2004-12-02 19:35:31 得分 10
记住一句话,变量在某一瞬间只保存一个值!!你就能明白了,Top
15 楼uow30(TheU)回复于 2004-12-02 20:39:00 得分 10
这个不同的编译器所得的结果可能不同的,因为对同一个式子有的是从左到右编译,有的是从右到左编译Top
16 楼hewittlee(只爱C++)回复于 2004-12-02 21:13:07 得分 0
要看编译器!Top
17 楼hj5182001(天行健)回复于 2004-12-03 00:04:20 得分 10
我在gcc里编译成汇编代码后
>gcc -O2 S 原文件名.c
.file "r.c"
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "y=%d\n"
.LC1:
.string "z=%d\n"
.text
.p2align 2,,3
.globl main
.type main,@function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
subl $8, %esp
pushl $6//------------------------->看见没有在编译器里6已经生成了
pushl $.LC0
call printf
popl %eax
popl %edx
pushl $8//------------------------->看见没有在编译器里8已经生成了
pushl $.LC1
call printf
leave
ret
.Lfe1:
.size main,.Lfe1-main
.ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"
Top
18 楼Eagle_118(语夜)回复于 2004-12-03 01:35:07 得分 0
不同编译起有不同的实现。
重要是先计算谁的问题。
Top
19 楼greenteanet(扎扎实实打基础,保持一颗平常心。)回复于 2004-12-03 01:39:29 得分 0
我用vc6.0试过,是6,8。但是可能对于不同的编译器而言,这个结果不同,因为在不同的编译器中,执行的方向不同,可能是从左到右,也可能是从右向左,不过一般情况下在上面的表达式的运算中,绝大部分都是从右向左的。
上面的两条表达式中,第一条是两个没有加1前的i相加,所以为6
第二个表达式是由于++i,先进行了自加,所以变成了4+4=8。Top
20 楼nirvana_li(东成西就,芝兰境界)回复于 2004-12-03 08:58:37 得分 10
连续的自增自减运算的结果是依赖于具体的编译器的。比如你在TC下编译的结果拿到DEV_C++下面,可能结果就是不一样的。所以为了使我们的程序能够在多个编译器上面能够编译成相同的结果,我们通常避免使用连续自增自减运算的形式。而是用更明确的表达式语句的方法来表示。
这些属于语言的一些细节,不用太过于追究。Top
21 楼liujingfu123(Oh_My_GoD)回复于 2004-12-03 09:31:21 得分 0
# include <stdio.h>
#include <math.h>
main(){
int i=3;
int y=0;
int z=0;
y=(i++)+(i++);
printf("y=%d\n",y);
i=3;
z=(i++)+(++i);
printf("z=%d\n",z);
}
VC6.0的编译结果
y=6
z=8
=====================================================================================
y=(i++)+(i++);
//表达式从右向左扫描,++都是后 +,即先操作再自加,则先把i=3相加即 3+3 赋值给y,所以 y=6
i=3;
z=(i++)+(++i);
//表达式从右向左扫描,后一个++是前 +,则i先自加变成 4 ,前一个++是后 +,所以 z=4+4=8咯
但两个 printf()语句之后 i 的值都是 5 了!
你大概是初学的,老师喜欢弄些这样的东西让你们来玩是吧?但这样的东西没什么用的,在不同的编译器里结果就不同,所以你在写程序的时候也最好不要去用它就OK了!
Top
22 楼China_Diablo(暗黑破坏神)回复于 2004-12-03 12:33:11 得分 0
明白了,谢谢各位老师
Top
23 楼China_Diablo(暗黑破坏神)回复于 2004-12-03 12:40:08 得分 0
分不够,没加分的同志只能对你你们进行口头感谢了
+_+Top




