刚学C++

tomatobin 2010-09-07 11:01:09
请教c++与++c有什么区别?
...全文
146 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fo1_sky 2010-09-08
  • 打赏
  • 举报
回复
是习惯问题
wyz007134 2010-09-07
  • 打赏
  • 举报
回复
c++是一种编程语言
++c应该是山寨的吧...
houxq123 2010-09-07
  • 打赏
  • 举报
回复
一般用c++;
harderman 2010-09-07
  • 打赏
  • 举报
回复
这问题有意思
xy0402 2010-09-07
  • 打赏
  • 举报
回复
前置++,就是“先加后用”
后置++,就是“先用后加”
bdxxxx 2010-09-07
  • 打赏
  • 举报
回复
一个在左一个在右。。。
liutengfeigo 2010-09-07
  • 打赏
  • 举报
回复
请教c++与++c有什么区别?
一眼不是看出来了?有什么好问的
  • 打赏
  • 举报
回复


main( )

{

int x,y,z;

x=y=2;z=3;

y=x++-1;printf("%d\t%d\t",x,y); /*x=3,y=1,后置++,先把x赋值给y,再做运算,而x的值无论是前还是后置都加1*/

y=++x-1;printf("%d\t%d\t",x,y);/*x=4,y=3,前置++,先把x加1后赋值给y,然后做运算(此行x初值是上行的终值=3)*/

y=z--+1;printf("%d\t%d\t",z,y); /*z=2,y=4,同上理可知*/

y=--z+1;printf("%d\t%d\t",z,y); /*z=1,y=2,同理可证*/

getch(); }



看这个例子吧,不想码字了
老邓 2010-09-07
  • 打赏
  • 举报
回复
测试代码:
#include <iostream>
#include <string>

using namespace std;

void test()
{
int j;

for (int i = 0; i < 10; ++i)
j = i;

for (int i = 0; i < 10; i++)
j = i;
}

int main()
{
test();
return 0;
}

004013D0	push   ebp
004013D1 mov ebp,esp
004013D3 sub esp,0x10
004013D6 mov DWORD PTR [ebp-0x8],0x0
004013DD jmp 0x4013e9 <test()+25>
004013DF mov eax,DWORD PTR [ebp-0x8]
004013E2 mov DWORD PTR [ebp-0xc],eax
004013E5 add DWORD PTR [ebp-0x8],0x1
004013E9 cmp DWORD PTR [ebp-0x8],0x9
004013ED setle al
004013F0 test al,al
004013F2 jne 0x4013df <test()+15>
004013F4 mov DWORD PTR [ebp-0x4],0x0
004013FB jmp 0x401407 <test()+55>
004013FD mov eax,DWORD PTR [ebp-0x4]
00401400 mov DWORD PTR [ebp-0xc],eax
00401403 add DWORD PTR [ebp-0x4],0x1
00401407 cmp DWORD PTR [ebp-0x4],0x9
0040140B setle al
0040140E test al,al
00401410 jne 0x4013fd <test()+45>
00401412 leave
00401413 ret
willabc 2010-09-07
  • 打赏
  • 举报
回复
我是来jf的
老邓 2010-09-07
  • 打赏
  • 举报
回复
当然,这里必须还要涉及到编译器优化的问题。
在有些场合,经过编译器优化后,++c与c++的效率是相当的。
老邓 2010-09-07
  • 打赏
  • 举报
回复
简单说,++c是直接把c的值+1
而c++是先创建一个临时变量,加1后再赋值给c。
老邓 2010-09-07
  • 打赏
  • 举报
回复
使用C++很多年了,在网上多次看到这样的言论:前置增量运算符(++i)的效率比后置增量运算符(i++)的效率高,因为i++需要返回的当前值后进行加运算,所以要保存当前值,而++i不需要返回当前值,就不用保存当前值。
使用i++已经习惯了,并且i++与C++语言名称相似,从感观上我觉得比++i更美观,如果让我改变这个习惯则需要充足的理由才行。
我这个人比较较真,于是就开始了求证之路。
首先,从C++Builder开始,测试代码为:
#include <stdio.h>

int x;

int test1(void)
{
return x++;
}

int test2(void)
{
return ++x;
}

int main(void)
{
x = 0x111;
for (int i = 0; i < 100; i++) x += i;
for (int j = 0; j < 100; ++j) x += j;
test1();
test2();
printf("%d\n", x);
return 0x123;
}

反编译结果(添加了源代码对应注释):
//int test1(void)
//{
:00401168 55 push ebp
:00401169 8BEC mov ebp, esp
// return x++;
:0040116B A174214000 mov eax, dword ptr [00402174]
:00401170 FF0574214000 inc dword ptr [00402174]
//}
:00401176 5D pop ebp
:00401177 C3 ret

//int test2(void)
//{
:00401178 55 push ebp
:00401179 8BEC mov ebp, esp
// return ++x;
:0040117B FF0574214000 inc dword ptr [00402174]
:00401181 A174214000 mov eax, dword ptr [00402174]
//}
:00401186 5D pop ebp
:00401187 C3 ret

//int main(void)
//{
:00401188 55 push ebp
:00401189 8BEC mov ebp, esp
:0040118B 83C4F8 add esp, FFFFFFF8
// x = 0x111;
:0040118E C7057421400011010000 mov dword ptr [00402174], 00000111
// for (int i = 0; i < 100; i++) x += i;
:00401198 33C0 xor eax, eax
:0040119A 8945FC mov dword ptr [ebp-04], eax
:0040119D 8B55FC mov edx, dword ptr [ebp-04]
:004011A0 011574214000 add dword ptr [00402174], edx
:004011A6 FF45FC inc [ebp-04]
:004011A9 837DFC64 cmp dword ptr [ebp-04], 00000064
:004011AD 7CEE jl 0040119D
// for (int j = 0; j < 100; ++j) x += j;
:004011AF 33C9 xor ecx, ecx
:004011B1 894DF8 mov dword ptr [ebp-08], ecx
:004011B4 8B45F8 mov eax, dword ptr [ebp-08]
:004011B7 010574214000 add dword ptr [00402174], eax
:004011BD FF45F8 inc [ebp-08]
:004011C0 837DF864 cmp dword ptr [ebp-08], 00000064
:004011C4 7CEE jl 004011B4
// test1();
:004011C6 E89DFFFFFF call 00401168
// test2();
:004011CB E8A8FFFFFF call 00401178
// printf("%d\n", x);
:004011D0 FF3574214000 push dword ptr [00402174]
:004011D6 68A4204000 push 004020A4
:004011DB E880010000 Call 00401360
// return 0x123;
:004011E0 83C408 add esp, 00000008
:004011E3 B823010000 mov eax, 00000123
//}
:004011E8 59 pop ecx
:004011E9 59 pop ecx
:004011EA 5D pop ebp
:004011EB C3 ret

结果表明,对于C++Builder的编译器而言,++i与i++生成的指令是一样的,只是顺序有点不同,当然效率也是一样的。

换一种环境,AIX Version 5.2,同样的测试代码,使用自带的cc编译器,反编译结果为:
(dbx) listi test1
0x1000035c (test1()+0x4) 80820044 lwz r4,0x44(r2)
0x10000360 (test1()+0x8) 80a40000 lwz r5,0x0(r4)
0x10000364 (test1()+0xc) 38650001 addi r3,0x1(r5)
0x10000368 (test1()+0x10) 90a10040 stw r5,0x40(r1)
0x1000036c (test1()+0x14) 90640000 stw r3,0x0(r4)
0x10000370 (test1()+0x18) 80610040 lwz r3,0x40(r1)
0x10000374 (test1()+0x1c) 90610044 stw r3,0x44(r1)
0x10000378 (test1()+0x20) 48000004 b 0x1000037c (test1()+0x24)
0x1000037c (test1()+0x24) 38210050 addi r1,0x50(r1)
0x10000380 (test1()+0x28) 4e800020 blr

(dbx) listi test2
0x100003a4 (test2()+0x4) 80620044 lwz r3,0x44(r2)
0x100003a8 (test2()+0x8) 80830000 lwz r4,0x0(r3)
0x100003ac (test2()+0xc) 38840001 addi r4,0x1(r4)
0x100003b0 (test2()+0x10) 90830000 stw r4,0x0(r3)
0x100003b4 (test2()+0x14) 80630000 lwz r3,0x0(r3)
0x100003b8 (test2()+0x18) 90610040 stw r3,0x40(r1)
0x100003bc (test2()+0x1c) 48000004 b 0x100003c0 (test2()+0x20)
0x100003c0 (test2()+0x20) 38210050 addi r1,0x50(r1)
0x100003c4 (test2()+0x24) 4e800020 blr
0x100003c8 (test2()+0x28) 00000000 Invalid opcode.

(dbx) listi main
0x100003f4 (main+0x10) 83e20048 lwz r31,0x48(r2)
0x100003f8 (main+0x14) 80820044 lwz r4,0x44(r2)
0x100003fc (main+0x18) 38600111 li r3,0x111
0x10000400 (main+0x1c) 90640000 stw r3,0x0(r4)

// for (int i = 0; i < 100; i++) x += i;
0x10000404 ($b2) 38600000 li r3,0x0
0x10000408 ($b2+0x4) 90610044 stw r3,0x44(r1)
0x1000040c ($b2+0x8) 4800002c b 0x10000438 ($b2+0x34)
0x10000410 ($b2+0xc) 80820044 lwz r4,0x44(r2)
0x10000414 ($b2+0x10) 80640000 lwz r3,0x0(r4)
0x10000418 ($b2+0x14) 80a10044 lwz r5,0x44(r1)
0x1000041c ($b2+0x18) 7c632a14 add r3,r3,r5
0x10000420 ($b2+0x1c) 90640000 stw r3,0x0(r4)
0x10000424 ($b2+0x20) 80610044 lwz r3,0x44(r1)
0x10000428 ($b2+0x24) 90610040 stw r3,0x40(r1)
0x1000042c ($b2+0x28) 80610044 lwz r3,0x44(r1)
0x10000430 ($b2+0x2c) 38630001 addi r3,0x1(r3)
0x10000434 ($b2+0x30) 90610044 stw r3,0x44(r1)
0x10000438 ($b2+0x34) 80610044 lwz r3,0x44(r1)
0x1000043c ($b2+0x38) 2c030064 cmpi cr0,0x0,r3,0x64
0x10000440 ($b2+0x3c) 4180ffd0 blt 0x10000410 ($b2+0xc)

// for (int j = 0; j < 100; ++j) x += j;
0x10000444 ($b3) 38600000 li r3,0x0
0x10000448 ($b3+0x4) 90610048 stw r3,0x48(r1)
0x1000044c ($b3+0x8) 48000024 b 0x10000470 ($b3+0x2c)
0x10000450 ($b3+0xc) 80820044 lwz r4,0x44(r2)
0x10000454 ($b3+0x10) 80640000 lwz r3,0x0(r4)
0x10000458 ($b3+0x14) 80a10048 lwz r5,0x48(r1)
0x1000045c ($b3+0x18) 7c632a14 add r3,r3,r5
0x10000460 ($b3+0x1c) 90640000 stw r3,0x0(r4)
0x10000464 ($b3+0x20) 80610048 lwz r3,0x48(r1)
0x10000468 ($b3+0x24) 38630001 addi r3,0x1(r3)
0x1000046c ($b3+0x28) 90610048 stw r3,0x48(r1)
0x10000470 ($b3+0x2c) 80610048 lwz r3,0x48(r1)
0x10000474 ($b3+0x30) 2c030064 cmpi cr0,0x0,r3,0x64
0x10000478 ($b3+0x34) 4180ffd8 blt 0x10000450 ($b3+0xc)

0x1000047c (main+0x98) 4bfffedd bl 0x10000358 (test1())
0x10000480 (main+0x9c) 4bffff21 bl 0x100003a0 (test2())
0x10000484 (main+0xa0) 80620044 lwz r3,0x44(r2)
0x10000488 (main+0xa4) 80830000 lwz r4,0x0(r3)
0x1000048c (main+0xa8) 63e30000 ori r3,r31,0x0
0x10000490 (main+0xac) 48000041 bl 0x100004d0 (printf)
0x10000494 (main+0xb0) 80410014 lwz r2,0x14(r1)
0x10000498 (main+0xb4) 38600123 li r3,0x123
0x1000049c (main+0xb8) 48000004 b 0x100004a0 (main+0xbc)
0x100004a0 (main+0xbc) 80010058 lwz r0,0x58(r1)
0x100004a4 (main+0xc0) 7c0803a6 mtlr r0
0x100004a8 (main+0xc4) 38210050 addi r1,0x50(r1)
0x100004ac (main+0xc8) 83e1fffc lwz r31,-4(r1)
0x100004b0 (main+0xcc) 4e800020 blr

test1函数比test2函数多一条stw指令,就是说i++比++i多一条stw指令,在main函数则多了两条指令(stw和lwz)。在我看来,RISC系统多执行一条指令所耗的资源非常有限,本身RISC就是通过执行更多的指令来达到精简指令的目的的。

结论:前置增量运算符(++i)与后置增量运算符(i++)的区别在某些编译器上生成的机器指令有区别,效率是++i优于i++但差别不大。
  • 打赏
  • 举报
回复
有歧义
tomatobin 2010-09-07
  • 打赏
  • 举报
回复
感谢大家 的指导,明白了,thanks
kouji1990 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 loaden 的回复:]
使用C++很多年了,在网上多次看到这样的言论:前置增量运算符(++i)的效率比后置增量运算符(i++)的效率高,因为i++需要返回的当前值后进行加运算,所以要保存当前值,而++i不需要返回当前值,就不用保存当前值。
使用i++已经习惯了,并且i++与C++语言名称相似,从感观上我觉得比++i更美观,如果让我改变这个习惯则需要充足的理由才行。
我这个人比较较真,于是就开始了求证之路。
……
[/Quote]你那样说,初学者能懂吗?
c=1;a=c++;b=++c;
则a=1,b=2;c两次都是2
前者是先赋值后运算,后者是先运算后赋值

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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