1. 編寫一個簡單的 C++ 程序
int main()
{
return 0;
}
main 函數(shù)的返回類型必須為 int,即整數(shù)類型。int 類型是一種 內(nèi)置類型 (built-in type),即語言自身定義的類型。
在大多數(shù)系統(tǒng)中,main 的返回值被用來指示狀態(tài)。返回值 0 表明成功,非 0 的返回值的含義由系統(tǒng)定義,通常用來指出錯誤類型。
重要概念:類型
類型是程序設(shè)計最基本的概念之一,一種類型不僅定義了數(shù)據(jù)元素的內(nèi)容,還定義了這類數(shù)據(jù)上可以進(jìn)行的運(yùn)算。
程序所處理的數(shù)據(jù)都保存在變量中,而每個變量都有自己的類型。如果一個名為 v 的變量的類型為 T,我們通常說 “v 具有類型 T”,或等價的,“v 是一個 T 類型變量”。
訪問 main 的返回值的方法依賴于系統(tǒng)。在 UNX 和 Windows 系統(tǒng)中,執(zhí)行完一個程序后,都可以通過 echo 命令獲得其返回值。
- 在
UNIX系統(tǒng)中,通過如下命令獲得狀態(tài):$ echo $? - 在
Windows系統(tǒng)中查看狀態(tài)可鍵入$ echo %ERRORLEVEL%
運(yùn)行 GNU 或微軟編譯器
-
運(yùn)行 GNU 編譯器的命令是 g++
$ g++ -o progl progl.cc注意:根據(jù)使用的 GNU 編譯器的版本,你可能需要指定
-std=c++0x參數(shù)來打開對 C++11 的支持) -
運(yùn)行微軟 Visual Studio2010 編譯器的命令為 cl:
> cl /EHsc progl.cpp命令 cl 調(diào)用編譯器,/EHsc 是編譯器選項,用來打開標(biāo)準(zhǔn)異常處理。
編譯器通常都包含一些選項,能對有問題的程序結(jié)構(gòu)發(fā)出警告。打開這些選項通常是一個好習(xí)慣。我們習(xí)慣在 GNU 編譯器中使用 -Wall 選項,在微軟編譯器中則使用 /W4。
更詳細(xì)的信息請查閱你使用的編譯器的參考手冊。
練習(xí) 1.1:査閱你使用的編譯器的文檔,確定它所使用的文件命名約定。編譯并運(yùn)行上面的 main 程序。
練習(xí) 1.2:改寫程序,讓它返回 - 1. 返回值 - 1 通常被當(dāng)作程序錯誤的標(biāo)識。重新編譯并你的程序,觀察你的系統(tǒng)如何處理 main 返回的錯誤標(biāo)識。
2. 初識輸入輸出
C++ 語言并未定義任何輸入輸出(IO)語句,取而代之,包含了一個全面的標(biāo)準(zhǔn)庫(standard library)來提供 IO 機(jī)制(以及很多其他設(shè)施)。
iostream 庫包含兩個基礎(chǔ)類型 istream 和 ostream,分別表示輸入流和輸岀流。一個流就是一個字符序列,是從 IO 設(shè)備讀出或?qū)懭?IO 設(shè)備的。術(shù)語 流(stream)想要表達(dá)的是,隨著時間的推移,字符是順序生成或消耗的。
標(biāo)準(zhǔn)輸入輸出對象
標(biāo)準(zhǔn)庫定義了 4 個 IO 對象,它們是上面 istream 或 ostream 類型的對象。4 個對象如下:
- cin 標(biāo)準(zhǔn)輸入,它是 istream 類的對象
- cout 標(biāo)準(zhǔn)輸出,它是 ostream 類的對象
- cerr 用來輸出警告和錯誤消息,也稱為標(biāo)準(zhǔn)錯誤,它是 ostream 類的對象
- clog 用來輸出程序運(yùn)行時的一般性信息,它是 ostream 類的對象
一個使用 IO 庫的程序
#include <iostream>
int main()
{
std::cout << "Enter two numbers: " << std::endl;
int v1 = 0, v2 = 0;
std::cin >> v1 >> v2;
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
return 0;
}
運(yùn)行結(jié)果如下:
Enter two numbers:
3 7
The sum of 3 and 7 is 10
在 C++ 中,一個表達(dá)式產(chǎn)生一個計算結(jié)果,它由一個或多個運(yùn)算對象和(通常是)一個運(yùn)算符組成。
下面表達(dá)式中
std::cout << "Enter two numbers: " << std::endl;
<< 運(yùn)算符接受兩個 運(yùn)算對象:左側(cè)的運(yùn)算對象必須是一個 ostream 對象,右側(cè)的運(yùn)算對象是要打印的值。
此運(yùn)算符將給定的值寫到給定的 ostream 對象中,它的計算結(jié)果就是其左側(cè)運(yùn)算對象。即,計算結(jié)果就是我們寫入給定值的那個 ostream 對象。
我們的輸出語句使用了兩次 << 運(yùn)算符。因?yàn)榇诉\(yùn)算符返回其左側(cè)的運(yùn)算對象,因此第一個運(yùn)算符的結(jié)果成為了第二個運(yùn)算符的左側(cè)運(yùn)算對象。這樣,我們就可以將輸出請求連接起來。因此,我們的表達(dá)式等價于
(std::cout << "Enter two numbers: ") << std::endl;
鏈中每個運(yùn)算符的左側(cè)運(yùn)算對象都是相同的。在本例中是 std::cout。我們也可以用兩條語句生成相同的輸出:
std::cout << "Enter two numbers: ";
std::cout << std::endl;
第一個輸出運(yùn)算符給用戶打印一條消息。這個消息是一個字符串字面值常量,是用一對雙引號包圍的字符序列。在雙引號之間的文本被打印到標(biāo)準(zhǔn)輸出。
第二個運(yùn)算符打印
endl,這是一個被稱為操縱符的特殊值。寫入 endl 的效果是結(jié)束當(dāng)前行,并將與設(shè)備關(guān)聯(lián)的緩沖區(qū)(buffer)中的內(nèi)容刷到設(shè)備中。緩沖刷新操作可以保證到目前為止程序所產(chǎn)生的所有輸出都真正寫入輸出流中,而不是僅停留在內(nèi)存中等待寫入到對應(yīng)設(shè)備的流。
[注] 程序員常常在調(diào)試時添加打印語句。這類語句應(yīng)該保證 “一直” 刷新流。否則,如果程序崩潰,輸出可能還留在緩沖區(qū)中,從而導(dǎo)致關(guān)于程序崩潰位置的錯誤推斷。
使用標(biāo)準(zhǔn)庫中的名字
前綴 std:: 指出名字 cout 和 end1 是定義在名為 std 的命名空間( namespace)中的。
命名空間可以幫助我們避免不經(jīng)意的名字定義沖突,以及使用庫中相同名字導(dǎo)致的沖突。
標(biāo)準(zhǔn)庫定義的所有名字都在命名空間 std 中
從流讀取數(shù)據(jù)
int v1 = 0, v2 = 0;
上面語句中,我們定義了兩個 int 類型的變量。int是一種內(nèi)置類型,用來表示整數(shù)。然后我們將它初始化為 0,初始化一個變量,就是在變量創(chuàng)建的同時為它賦予一個值。
std::cin >> v1 >> v2;
輸入運(yùn)算符 >> 與輸出運(yùn)算符類似,它接受一個 istream 作為其左側(cè)運(yùn)算對象,接受一個對象作為其右側(cè)運(yùn)算對象。它從給定的 istream 讀入數(shù)據(jù),并存入給定對象中。與輸出運(yùn)算符類似,輸入運(yùn)算符返回其左側(cè)運(yùn)算對象作為其計算結(jié)果。因此,此表達(dá)式等價于
(std::cin >> v1) >> v2;
或者
std::cin >> v1;
std::cin >> v2;
完成程序
std::cout << "The sum of " << v1 << " and " << v2
<< " is " << v1 + v2 << std::endl;
這條語句雖然比提示用戶輸入的打印語句更長,但原理上是一樣的,它將每個運(yùn)算對象打印在標(biāo)準(zhǔn)輸出上。其中比較有意思的地方在于運(yùn)算對象并不都是相同類型的值。標(biāo)準(zhǔn)庫定義了不同版本的輸入輸出運(yùn)算符,來處理這些不同類型的運(yùn)算對象。