codeblocks 中z=2;z=z++,z的结果仍为2?求大神解答!! 10C

codeblocks 中z=2;z=z++,z的结果仍为2.?
求大神解答!!!
请大家先在codeblocks运行一下再回答。

int z = 2;

z = z++;

cout<<z;//输出仍为2

老师让找出原因???

c c++

29个回答

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

  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

首先要明确自增运算符的确切含义,自增有前缀形式和后缀形式,例如本题中的z++就是后缀形式,它的功能是在使用变量z之后,再使z的值加一。所以最终输出的结果还是2.如果改成前缀形式,z=2,++z这样子就是使z的值加一再使用它就可以输出3了

z=z++这一句里z++把z加到3,然后返回2赋值给z,因此输出仍为2.
不妨这样改一下:
int z=2;
int t=z++;
z=t;
cout<<z;

w_weilan
wu-kan 回复qq_36316736: c++标准没有规定自增是在表达式中自增还是表达式整个算完之后在自增,所以不同编译器有区别的
大约一年之前 回复
qq_36316736
武志祥 但在vc中结果是3啊
接近 2 年之前 回复

z++是先参加程序的运行再+1

qq_36316736
武志祥 但最后结果不应该是3吗
接近 2 年之前 回复

您好,我虽然没试过,但是这个vc及其他翻译器是不一样的,您选择c或者c++编译前后顺序都是不一样的,
虽然c++可以说是c的扩张。所以直接原因是代码本该等于2(在codeblock中),根本原因是编译器的原因,
老师出这个题目的目的要的就是您能认清编译器的不同,结果也不一样,这个特别是c++和c;后期的java则基本一样的。
因为java的兼容更好。谢谢

qq_41719529
路边一颗小白菜 如果在C语言中的话结果应该是3,应该是在codeblocks中是先将z的值返回到z中再执行的z++,建议把z=z++,改成t=z++,再cout<<t;cout<<z;来区别一下
一年多之前 回复
qq_38104740
qq_3095349095 对了,另外直接原因可以这样说z=z++,是先赋值给z再计算“++”的,所以输出的是直接赋值给z的2
接近 2 年之前 回复

++这个符号是用来自加的

简单来说z++和++z都等价于z=z+1;
一般来说单独使用是没有什么区别的

但又与赋值符号=一起使用时是有区别的

z++的话,是先赋值,再自加

++z的话是先自加,再赋值

比方说z=1

对于t=z++,t的值为1

对于t=++z,t的值为2

看编译器实际生成的代码的协会顺序啊
[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赋值给左值,然后在++的

int z = 2;
z 1= z++;
cout<<z1;
z1=2 z=3了
先赋值左边的然后右边的在进行自加
如果++在前面
int z = 2;
z 1= ++z;
z1=3 z=3
先自加在赋值

qq_36316736
武志祥 如果是先赋值左边再自加那结果不还是3吗,前面的z和后面的z对应的地址应该一样吧
接近 2 年之前 回复
共29条数据 1 3 尾页
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!