[c++ primer plus] [ chapter 2 開始學習c++] ——2. c++基本語句

來源:互聯網
上載者:User

[c++ primer plus] [ chapter 2 開始學習c++]

2. c++基本語句

// carrot.cpp -- c++基本語句#include <iostream>int main (void){  using namespace std;  int b;  b = 2;  int a = 1;  int c;  cout << "Enter an integer:";  cin >> c;  cout << "a is " << a       << ",b is " << b       << ",c is " << c       << ".\n";      return 0;}


2.1 定義與聲明

以前一直不能很好的分清楚這兩個概念,現在澄清一下。


int b;

定義了一個整型變數,即為b分配了適合於整型變數的儲存空間。

同時它又是一個聲明,對於聲明的概念,我的理解是,以後再遇到b時,告訴編譯器,存在一個b的定義,這樣編譯器就知道不應該報錯。

聲明不一定是定義,例如


extern int d;


就是一個聲明,告訴編譯器,存在一個d的定義,並且extern表明這個定義可能在其它地方。這裡是不為d分配空間的。(關於extern)

總結:定義分配空間,聲明不分配,聲明只是告訴編譯器存在這樣一個定義。


2.2 初始化與賦值

看下面的代碼

初始化


// ta.cpp - test difference betwwen assignment and initializationint main (void){  static  int a = 1; // 初始化  return 0;}

編譯成組合語言

g++ -Wall -S ta.cpp -o ta.s


.file"ta.cpp".text.globl main.typemain, @functionmain:.LFB0:.cfi_startproc.cfi_personality 0x0,__gxx_personality_v0pushl%ebp.cfi_def_cfa_offset 8movl%esp, %ebp.cfi_offset 5, -8.cfi_def_cfa_register 5movl$0, %eaxpopl%ebpret.cfi_endproc.LFE0:.sizemain, .-main.data.align 4.type_ZZ4mainE1a, @object.size_ZZ4mainE1a, 4_ZZ4mainE1a:.long1.ident"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3".section.note.GNU-stack,"",@progbits


同理

賦值代碼

// tb.cpp - test difference betwwen assignment and initializationint main (void){  static int a;  a = 1; // 賦值    return 0;}


編譯成組合語言:g++ -Wall -S tb.cpp  -o tb.s

.file"tb.cpp".text.globl main.typemain, @functionmain:.LFB0:.cfi_startproc.cfi_personality 0x0,__gxx_personality_v0pushl%ebp.cfi_def_cfa_offset 8movl%esp, %ebp.cfi_offset 5, -8.cfi_def_cfa_register 5movl$1, _ZZ4mainE1amovl$0, %eaxpopl%ebpret.cfi_endproc.LFE0:.sizemain, .-main.local_ZZ4mainE1a.comm_ZZ4mainE1a,4,4.ident"GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3".section.note.GNU-stack,"",@progbits


從編譯出的彙編代碼可以看出二者在處理上有什麼不同.

如果去掉static,我的實驗中兩者的彙編代碼是一樣的。

在遞迴函式中,是否使用static,是初始化還是賦值,有很大的差別。

如果眼睛像我一樣不好用,可以用Emacs的比較檔案功能:

M-x ediff 命令啟動

根據提示輸入ta.s tb.s

然後就可以比較了,右上方的一個frame裡顯示不同的地方有幾處,把游標放在那裡,用p n可以切換不同之處的位置。


2.3 cin

cin 與cout一樣,都在名稱空間std中,用於輸入

2.4 cout 的新特性

代碼

cout << "a is " << a << ", b is " << b << endl;


將字串和變數串接到一起輸出。

這裡有兩個問題

為什麼可以串接:原因在於 cout << "a is " 輸出字串 “a is ", 並返回cout對象,此時相當於

cout << a << ", b is " << b << endl;


以此類推。

為什麼不用指定變數類型:原因在於“多態性“,cout 所在類重戴了"<<"操作符,使它可以根據變數的不同類型作出不同的反應,它比C語言中的printf函數更“智能”了。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.