codeblocks 中z=2;z=z++,z的结果仍为2.?
求大神解答!!!
请大家先在codeblocks运行一下再回答。
int z = 2;
z = z++;
cout<<z;//输出仍为2
老师让找出原因???
z=z++这一句里z++把z加到3,然后返回2赋值给z,因此输出仍为2.
不妨这样改一下:
int z=2;
int t=z++;
z=t;
cout<<z;
z++是先参加程序的运行再+1
Code:
0: iconst_0 //0放到栈顶
1: istore_1 //把栈顶的值保存到局部变量1,也就是i中
2: iload_1 //把i的值放到栈顶,也就是说此时栈顶的值是0
3: iinc 1, 1 //注意这个指令,把局部变量1,也就是i,增加1,这个指令不会导致栈的变化,也就是说局部变量1,即i此时为1了。
6: istore_1 //把栈顶的值(0)保存到局部变量1,也就是让i为0了,所以最后i为0
7: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
14: return
您好,我虽然没试过,但是这个vc及其他翻译器是不一样的,您选择c或者c++编译前后顺序都是不一样的,
虽然c++可以说是c的扩张。所以直接原因是代码本该等于2(在codeblock中),根本原因是编译器的原因,
老师出这个题目的目的要的就是您能认清编译器的不同,结果也不一样,这个特别是c++和c;后期的java则基本一样的。
因为java的兼容更好。谢谢
Z=Z++;这一句是先赋值给Z然后Z再加1,可以改成Z=++Z;或者Z+=Z;
++这个符号是用来自加的
简单来说z++和++z都等价于z=z+1;
一般来说单独使用是没有什么区别的
但又与赋值符号=一起使用时是有区别的
z++的话,是先赋值,再自加
++z的话是先自加,再赋值
比方说z=1
对于t=z++,t的值为1
对于t=++z,t的值为2
先将z赋值给左值,然后在++的
看编译器实际生成的代码的协会顺序啊
[root@localhost dns]# cat t.c
#include
void main()
{
int z=2;
z=z++;
printf("z=%d\n",z);
}
[root@localhost dns]# ./t
z=2
objdump -d t::::::::::::::
0000000000400530 :
400530: 55 push %rbp
400531: 48 89 e5 mov %rsp,%rbp
400534: 48 83 ec 10 sub $0x10,%rsp
** 400538: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp) //z=2
40053f: 8b 45 fc mov -0x4(%rbp),%eax //eax=z=2
400542: 8d 50 01 lea 0x1(%rax),%edx //edx=3=2+1
400545: 89 55 fc mov %edx,-0x4(%rbp) //z=edx=3
400548: 89 45 fc mov %eax,-0x4(%rbp) //z=eax=2**
40054b: 8b 45 fc mov -0x4(%rbp),%eax
40054e: 89 c6 mov %eax,%esi
400550: bf 00 06 40 00 mov $0x400600,%edi
400555: b8 00 00 00 00 mov $0x0,%eax
40055a: e8 b1 fe ff ff callq 400410 printf@plt
40055f: c9 leaveq
z=z++,是先把z的值赋值给z,再将z自加1,因此z的值当然为2. 如果在这一句后面再加上y=z,那么这时y的值就是3了。
int z = 2;
z 1= z++;
cout<<z1;
z1=2 z=3了
先赋值左边的然后右边的在进行自加
如果++在前面
int z = 2;
z 1= ++z;
z1=3 z=3
先自加在赋值
int z = 2;
z = z++; //“++”运算符优先级大于“=”运算符,该语句的运算过程:temp=z(z=2),然后做z++操作(z=3),最后执行“=”赋值运算z=temp.
cout<<z;
如果要修改,可以改为:
int z = 2;
z++;
cout<<z;
或者:
int z = 2;
z=++z;
cout<<z;
你理解z++和++z的话,这个问题就好理解了
z=2;
那么cout<<z++;的结果是2
而cout<<++z的结果是3
说明问题:
z=z++;
(z++)值是2的时候已经赋值给z了,
可以变化变量字符比较好理解
t=0;
z=2;
t=z++;(z++结果是2,所以t=2)
z=t;
最后z=2
如果执行下面的,结果就是3
z=2;
z++;
cout<<z;结果是3
原因:执行cout<<z时的z值已经是上面一步z++执行结束的结果值,即z已经加1完成了
z=2,z=z++;
相当于 y=z++,z=y
由于z++,是先赋值,再自加 ,于是 y=z=2,z=z+1=3
然后 z=y=2
换种说法,将z++看作一个函数,函数运行z=3,返回值2; 最后 z=函数返回值2
一种z++一种++z,z++先出原值再下一句才是加完后的值。++z直接是加完后的值。
例:(i=i)++,输出i时是先赋值(此时i还没加1),再加1
i=(++i),输出i时(此时i先加1),后赋值。我用挎号挎起来你就好理解了,
z=z++是先赋值再++,z=++z是先+再赋值,
据我所知,Z是先运行,然后再加1的
先将z赋值给左值,然后在++的,z++是先参加程序的运行再+1
我在mingw编译器下运行过了,结果是2。
可以这么理解:
编译器首先处理赋值符号,这里它的左边是变量z,是一个内存空间,它也是一个左值表达式;同时赋值号右边是一个右值表达式。在得出右边表达式的值
之后赋值操作才会进行,但是右边表达式是z++
,这个表达式的值毫无疑问是2,但是它会有副作用,把z这个变量加一。问题的关键是这个副作用(自增)先
进行还是表达式的赋值操作先进行。这个问题C/C++语言的标准并没有规定,它的具体实现细节跟编译器相关。
在我的机器上,它结果是2,也就是说先执行的自增操作(z变为3),再进行赋值(z赋值为2)。
也可以从相应的汇编代码中找到细节:
00401471: call 0x401a20 <__main>
4 int z = 2;
00401476: movl $0x2,-0xc(%ebp)
5 z = z++;
0040147d: mov -0xc(%ebp),%eax
00401480: lea 0x1(%eax),%edx
00401483: mov %edx,-0xc(%ebp)
00401486: mov %eax,-0xc(%ebp)
6 std::cout << z;
解释下这段代码:z
是个局部变量,保存在栈上-0xc(%ebp)
的位置,然后把它的内容传给eax
,然后把eax + 1
传给edx
(对应于自增操作)
,把edx
传给0xc(%ebp)
即变量z,然后又把eax
传给z
(对应于赋值符的赋值操作)。所以就出现了结果2.
递增递减运算符有两个版本:
前置,即“++z”,返回的是递增后的值。
而后置,“z++”,返回的是递增前的值。
没有分清Z++和++Z的区别,像你这么写的话,把本身的值赋给自己,结果不会变化
若a=2;
++a 是a加1,返回a。
所以在 z=z++时,++运算符的优先级比=高,先执行++运算符要做的事。
先创建z'=2,z加1为3,准备返回副本z'。后缀++已经执行完了,这时只执行=,使值为3的z被赋值z',最终z=2!
vs编译器输出结果是3.
cygwin d gcc编译器输出结果是2:
Hardware watchpoint 3: z
Old value = 0
New value = 2
main () at maincpp2.cpp:9
9 z = z++;
(gdb) print z
$2 = 2
(gdb) step
[New Thread 299076.0x4a95c]
Hardware watchpoint 3: z
Old value = 2
New value = 3
0x00000001004010fd in main () at maincpp2.cpp:9
9 z = z++;
(gdb) print z
$3 = 3
(gdb) step
Hardware watchpoint 3: z
Old value = 3
New value = 2
main () at maincpp2.cpp:11
11 cout<<z<<std::endl;
从上面的调试输出可以看到,中间有过值3,但是后来又被覆盖掉了。
应该是 z先被赋值2, 自增3,但用自增前的值(2)再次等号赋值给了z,又回到了2
一句话,z=z++这种语句没有标准规定应该如何执行,具体结果有编译器决定。
首先要明确自增运算符的确切含义,自增有前缀形式和后缀形式,例如本题中的z++就是后缀形式,它的功能是在使用变量z之后,再使z的值加一。所以最终输出的结果还是2.如果改成前缀形式,z=2,++z这样子就是使z的值加一再使用它就可以输出3了
z=z++,相当于把z的值先返回赋给z,然后再自加1.
z=++z,相当于z先自加1等于3,然后再返回赋值给z.
基础不太扎实哦,不理解++Z和Z++
z++和++z的最大区别在于
z++可简单理解为表达式z=z++是z是值是2;用完之后z++,++在后面,即再加1;
++z就是先加1后z的值;
倘若两个表达式在执行完这个语句时那就都是3了
z++是先运算 再自加
++z 是题主理解的运算方式