您的位置:首页 > 编程语言 > C语言/C++

C++学习笔记---开题篇

2010-04-02 12:09 239 查看
写在前面:

我06年升入烟台大学,大一下学期开始接触C++,掐指算来接触C++也有三年有余。但是真正学习C++的时间几乎为零。我们当时学的是谭浩强的《c++程序设计》清华大学出版社。学完这本书后,开始长达一年的空白阶段。大三开始重温C++,期间读了《More Effective C++》《C++ STL》《More Effective STL》等书籍。

大二下学期开始学习MFC,一直到现在只学的皮毛。后来又接触了Qt设计。欲感C++的博大精深。也感到自己C++基础薄弱。故,重温C++。分享自己学习的心的。也希望大家能够指出其中的不足。

一个问题:

question:i++,++i,i+=1的区别?

先来看一下一位资深网友的回答:

“计算机内部实现过程有别,详细如下:
i=i+1的过程相当:
  temp=i+1; i=temp;

i++的过程相当:

  temp=i; i=temp+1; return temp;

++i的过程最简单:

  i增1然后return i 的值,一步完成,没有给任何temp变量赋值”

现在为了测试这句话的正确性,我编辑一个最简单的代码来查看汇编测试:

int i=0;

i++;

++i;

i+=1;

汇编效果:

i++;
0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,1
00401035   mov         dword ptr [ebp-4],eax
108:
109:     ++i;
00401038   mov         ecx,dword ptr [ebp-4]
0040103B   add         ecx,1
0040103E   mov         dword ptr [ebp-4],ecx
110:
111:     i = i + 1;
00401041   mov         edx,dword ptr [ebp-4]
00401044   add         edx,1
00401047   mov         dword ptr [ebp-4],edx
112:
113:     i += 1;
0040104A   mov         eax,dword ptr [ebp-4]
0040104D   add         eax,1
00401050   mov         dword ptr [ebp-4],eax


可以看出并没有什么区别。但是计算机组成原理中曾经提到:++i和i++单句用的时候,编译器就按照i += 1;处理了.

于是更改为复合语句来实现。代码如下:

int i = 0;
if ( ++i )
{
printf("先增再用" );
}

int j = 0;
if ( j++ )
{
printf("用了再增");
}


结果汇编效果如下:

if ( ++i )
004113E5  mov         eax,dword ptr [i]
004113E8  add         eax,1
004113EB  mov         dword ptr [i],eax
004113EE  je          wmain+47h (411407h)

if ( j++ )
0041140E  mov         eax,dword ptr [j]
00411411  mov         dword ptr [ebp-0DCh],eax
00411417  mov         ecx,dword ptr [j]
0041141A  add         ecx,1
0041141D  mov         dword ptr [j],ecx
00411420  cmp         dword ptr [ebp-0DCh],0
00411427  je          wmain+80h (411440h)


我们这样可以看到他们之间的区别。上面那位网友所言甚是。

写在最后:

以后的笔记我以《c++ primer中文版》为基石,加入自己的看法。希望大家能指出其中的不足,指正其中的错误。我们在追求技术巅峰的路上,共勉之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: