學習一門新的程式語言的最好方法就是練習編寫程式。
每個c++程式都包含乙個或多個函式(function),其中乙個必須命名為main。作業系統通過呼叫main來執行c++程式。
下面是乙個簡單的main函式,它什麼都不做,只是返回給作業系統乙個值:
int main()
main函式的返回型別必須為int。int型別是一種內建型別(built-in type),即語言自身定義的型別。
函式體是乙個以左花括號(curly brace)開始,以右花括號結束的語句塊(block of statements)。
return語句結束函式的執行。main的返回值被用來指示狀態。返回值0表明成功,非0的返回值的含義由系統定義,通常用來指出錯誤型別。
重要概念:型別
一種型別不僅定義了資料元素的內容,還定義了這類資料上可以進行的運算。程式所處理的資料都儲存在變數中,而每個變數都擁有自己的型別。
編寫好程式後,我們就需要編譯它,這依賴於作業系統和編譯器。
程式原始檔命名約定
程式檔案通常被稱為原始檔(source file)。它以乙個字尾為結尾,告訴系統這個檔案是乙個c++程式,比如.cpp。
c++包含了乙個全面的標準庫(standard library)來提供io機制(以及很多其他設施)。
iostream庫包含兩個基礎型別istream和ostream,分別表示輸入流和輸出流。乙個流就是乙個字串行,是從io裝置讀出或寫入io裝置的。
標準輸入輸出物件
標準庫定義了4個io物件。為了處理輸入,使用名為cin的istream型別的物件。這個物件被稱為標準輸入(standard input)。對於輸出,使用名為cout的ostream型別的物件。這個物件被稱為標準輸出(standard output)。另外還有其他兩個ostream物件,名為cerr和clog,cerr通常用來輸出警告和錯誤訊息,因此被稱為標準錯誤(standard error)。clog用來輸出程式執行時的一般性訊息。
系統通常將程式所執行的視窗與這些物件關聯起來。因此,當讀取cin,資料將從程式正在執行的視窗讀入,當向cout寫入資料時,將會寫到同乙個視窗。
!!!note
clog關聯到標準錯誤,預設情況下,寫到clog的資料是被緩衝的。寫到cerr的資料是不緩衝的。
乙個使用io庫的程式
#include int main()
#include
告訴編譯器我們想要使用iostream庫。尖括號中的名字指出了乙個標頭檔案(header)。每個使用標準庫設施的程式都必須包含相關的標頭檔案。#include指令和標頭檔案的名字必須寫在同一行中。#include指令一般出現在所有函式之外,原始檔的開始位置。
向流寫入資料
std::cout << "enter two numbers" << std::endl;
這條語句執行了乙個表示式(expression)。在c++中,乙個表示式產生乙個計算結果,它由乙個或多個運算物件和(通常是)乙個運算子組成。這條語句中的表示式使用了輸出運算子(<<)。
<<
運算子接受兩個運算物件:左側必須是乙個ostream物件;右側是要列印的值。此運算子將給定的值寫到給定的ostream物件中。計算結果是左側的ostream物件。
"enter two numbers"是乙個字串字面值常量(string literal),它是用一對雙引號包圍的字串行。
endl是乙個被稱為操縱符(manipulator)的特殊值。寫入endl的效果是結束當前行,並將與裝置關聯的緩衝區(buffer)中的內容刷到裝置中。
!!!note
乙個表示式接乙個分號就是一條語句。
使用標準庫中的名字
字首std::指出名字cout和endl是定義在名為std的命名空間(namespace)中的。
命名空間可以幫助我們避免不經意的名字定義衝突。標準庫定義的所有名字都在命名空間std中。
從流讀取資料
首先定義兩個名為v1和v2的變數(variable)來儲存輸入:
int v1 = 0, v2 = 0;
這兩個變數被定義為int型別,並初始化(initialize)為0。初始化乙個變數,就是在變數建立的同時為它賦予乙個值。
std::cin >> v1 >> v2;
這條語句讀入輸入資料。輸入運算子(>>)接受乙個istream作為其左側運算物件,接受乙個物件作為其右側運算物件。它從給定的istream讀入資料,並存入給定物件中。輸入運算子返回其左側運算物件作為計算結果。
注釋(comments)通常用於概述演算法,確定變數的用途,或者解釋晦澀難懂的**段。編譯器會忽略掉注釋,因此注釋對程式的行為和效能不會有任何影響。
c++中注釋的種類
c++中有兩種注釋:單行注釋和界定符注釋。
注釋界定符不能巢狀
界定符對形式的注釋是以/*
開始,以*/
結束的。因此,乙個注釋不能巢狀在另乙個注釋之內。
如果在除錯期間要注釋掉包含界定符對形式注釋的**,最好的方式是用單行注釋方式注釋掉**段的每一行。
// /*
// * comments
// */
語句一般是順序執行的,語句塊的第一條語句首先執行,然後是第二條,以此類推。但程式語言提供了多種不同的控制語句,允許我們寫出更為複雜的執行路徑。
while語句反覆執行一段**,直到給定條件為假為止。
while語句的形式為:
while (condition)
statement
while語句的執行過程是交替地檢測condition條件和執行關聯的語句statement,直至condition為假時停止。所謂條件就是乙個產生真或假的結果的表示式。
statement可以是語句塊,也叫迴圈體。所謂語句塊(block),就是用花括號包圍的語句序列。語句塊也是語句的一種,在任何要求使用語句的地方都可以使用語句塊。
每個for語句都包含兩部分:迴圈頭和迴圈體。迴圈頭控制迴圈體的執行次數,它由三部分組成:乙個初始化語句(init-statement)、乙個迴圈條件(condition)以及乙個表示式(expression)。
比如:
for (int val = 1; val <= 10; ++val)
sum += val;
for迴圈的總體執行流程:
建立變數val,將其初始化為1,它僅在迴圈內部存在。
檢測val是否小於等於10。如果檢測成功,執行迴圈體。若失敗,退出迴圈。
將val的值增加1。
重複第二個步驟。
使用這樣的方法連續讀入資料,直到遇到檔案尾(linux下,輸入ctrl+d):
while (std::cin >> value)
statement
輸入運算子返回其左側物件,因此,此迴圈條件檢測的是std::cin。
當使用乙個istream物件作為條件時,其效果是檢測流的狀態。如果流是有效的,那麼檢測成功。當遇到檔案結束符(end-of-file),或遇到乙個無效輸入時,istream物件的狀態會變為無效。
if也對乙個條件求值,書本裡有乙個完整的例子。
語法大致如此:
if (condition) else
在c++中,通過定義乙個類(class)來定義自己的資料結構。乙個類定義了乙個型別,以及與其關聯的一組操作。
類似使用標準庫設施,我們也需要使用標頭檔案來自己的類。習慣上,標頭檔案根據類名來命名,使用.h作為標頭檔案的字尾。標準庫的標頭檔案通常不帶字尾。
什麼是成員函式?
有這樣的檢測條件:
item1.isbn() == item2.isbn()
呼叫名為isbn的成員函式(member function)。成員函式是定義為類的一部分的函式。
使用**點運算子(.)**來表達我們需要「名為item1的物件的isbn成員」。點運算子只能用於類型別的物件。其左側運算物件必須是乙個類型別的物件,右側運算物件必須是該型別的乙個成員名,運算結果為右側運算物件指定的成員。
我們使用**呼叫運算子(())**來呼叫乙個函式,它是一對圓括號,裡面放實參列表(可能為空)。
第一章 開始
main函式的返回型別必須為 int,即整數型別。大多數系統中,main的返回值被用來指示狀態,返回值0表示成功,非0的返回值的含義由系統定義,通常用來指出錯誤型別。整合開發環境 integrated developed environment,ide c 語言並未定義任何輸入輸出 io 語句,取而...
C 基礎學習課程 第一章 開始
第一章 開始 在第一章中我們將從如何學習c 和我們需要學習什麼?兩個問題開始我們的學習之旅。如何學習c c 作為一種高階機器語言,儘管區別於我們的溝通語言,但也有語言該具有的一些共性 語法,詞彙。思考一下我們是如何學習英語的?首先是了解單詞,然後是短語,接著是句子,最後是對話。c 學習亦是如此,我們...
C Primer 第一章 開始
1.main函式的返回型別必須為int。2.乙個注釋不能巢狀早另乙個注釋之內。3.成員函式 member function 是定義為類的一部分的函式,有時也被稱為方法 method 4.寫入操作符 manipulator 結束當前行,並將與裝置關聯的緩衝區中的內容刷到裝置中。緩衝重新整理操作可以保證...