C 學習筆記五 語句

2022-02-03 13:19:10 字數 3805 閱讀 5785

一、復合語句(塊):復合語句,通常被稱為,是用一對花括號括起來的語句序列(也可能是空的)。塊標識了乙個作用域,在塊中引入的名字只能在該塊內部或巢狀在塊中的子塊裡訪問。通常,乙個名字只從其定義處到該塊的結尾這段範圍內可見。復合語句用在語法規則要求使用單個語句但程式邏輯卻需要不止乙個語句的地方。例如,while 或 for 語句的迴圈體

二、語句作用域:在語句的控制結構中定義的變數,僅在定義它們的塊語句結束前有效。這種變數的作用域限制在語句體內。

三、條件表示式:乙個類型別能否用在條件表示式中取決於類本身。迄今為止,在所有用過的類型別中,io 型別可以用作條件,但 vector 型別和 string 型別一般不可用作條件。

四、switch 語句:

1.關鍵字 case 和它所關聯的值稱為case 標號。每個 case 標號必須是整型常量表示式。

例如,下面的標號將導致編譯時的錯誤:

// illegal case label values

case 3.14: // noninteger

case ival: // nonconstant

如果兩個 case 標號具有相同的值,同樣也會導致編譯時的錯誤。

2.如果表示式與其中乙個 case 標號的值匹配,則程式將從該標號後面的第乙個語句開始依次執行各個語句,直到 switch 結束或遇到 break 語句為止。如果沒有發現匹配的 case 標號(並且也沒有 default 標號),則程式從 switch 語句後面的第一條繼續執行。

3.如果需要為某個特殊的 case 定義變數,則可以引入塊語句,在該塊語句中定義變數,從而保證這個變數在使用前被定義和初始化。

case true:

break;

case false:

// ...

五、while迴圈:在迴圈條件中定義的變數在每次迴圈裡都要經歷建立和撤銷的過程。

六、for迴圈:1.在 for 語句頭定義的任何物件只限制在 for 迴圈體裡可見。

2.可以在 for語句的 中定義多個物件;但是不管怎麼樣,該處只能出現乙個語句,因此所有的物件必須具有相同的一般型別:

const int size = 42;

int val = 0, ia[size];

// declare 3 variables local to the for loop:

// ival is an int, pi a pointer to int, and ri a reference to int

for (int ival = 0, *pi = ia, &ri = val;

ival != size;

++ival, ++pi, ++ri)

// ...

七、do while迴圈:在迴圈條件中使用的變數,不能在do內定義。如果可以在迴圈條件中定義變數的話,則對變數的任何使用都將發生在變數定義之前!

八、break 語句:用於結束最近的 while、do while、for 或 switch 語句,並將程式的執行權傳遞給緊接在被終止語句之後的語句。當 break 出現在巢狀的 switch 或者迴圈語句中時,將會終止裡層的 switch 或迴圈語句,而外層的 switch 或者迴圈不受影響

九、continue 語句:導致最近的迴圈語句的當次迭代提前結束。對於 while 和 do while 語句,繼續求解迴圈條件。而對於 for 迴圈,程式流程接著求解 for 語句頭中的 expression 表示式。

十、try 塊和異常處理:

1.異常就是執行時出現的不正常,例如執行時耗盡了記憶體或遇到意外的非法輸入。異常存在於程式的正常功能之外,並要求程式立即處理。在設計良好的系統中,異常是程式錯誤處理的一部分。當程式**檢查到無法處理的問題時,異常處理就特別有用。在這些情況下,檢測出問題的那部分程式需要一種方法把控制權轉到可以處理這個問題的那部分程式。錯誤檢測程式還必須指出具體出現了什麼問題,並且可能需要提供一些附加資訊。

2.try 塊的通用語法形式是:

try  catch (exception-specifier)  catch (exception-specifier)  //...

try 塊以關鍵字 try 開始,後面是用花括號起來的語句序列塊。try 塊後面是乙個或多個 catch 子句。每個 catch 子句包括三部分:關鍵字 catch,圓括號內單個型別或者單個物件的宣告——稱為異常說明符,以及通常用花括號括起來的語句塊。如果選擇了乙個 catch 子句來處理異常,則執行相關的塊語句。一旦 catch 子句執行結束,程式流程立即繼續執行緊隨著最後乙個 catch 子句的語句。

3.在複雜的系統中,程式的執行路徑也許在遇到丟擲異常的**之前,就已經經過了多個 try 塊。例如,乙個 try 塊可能呼叫了包含另一 try 塊的函式,它的 try 塊又呼叫了含有 try 塊的另乙個函式,如此類推。對於這種情況:

如果不存在處理該異常的 catch 子句,程式的執行就要跳轉到名為terminate的標準庫函式,該函式在 exception 標頭檔案中定義。這個標準庫函式的行為依賴於系統,通常情況下,它的執行將導致程式非正常退出。

4.標準異常類中定義在 標頭檔案,標準庫異常類只提供很少的操作,包括建立、複製異常型別物件以及異常型別物件的賦值。exception、bad_alloc 以及 bad_cast 型別只定義了預設建構函式,無法在建立這些型別的物件時為它們提供初值。其他的異常型別則只定義了乙個使用 string 初始化式的建構函式。當需要定義這些異常型別的物件時,必須提供一想 string 引數。string 初始化式用於為所發生的錯誤提供更多的資訊。異常型別只定義了乙個名為 what 的操作。這個函式不需要任何引數,並且返回 const char* 型別值。

5.使用預處理器進行除錯:用 ndebug 預處理變數實現有條件的除錯**:

int main()

2)每個assert只檢驗乙個條件,因為同時檢驗多個條件時,如果斷言失敗,無法直觀的判斷是哪個條件失敗

不好: assert(noffset>=0 && noffset+nsize<=m_ninfomationsize);

好: assert(noffset >= 0);

assert(noffset+nsize <= m_ninfomationsize);

3)不能使用改變環境的語句,因為assert只在debug個生效,如果這麼做,會使用程式在真正執行時遇到問題

錯誤: assert(i++ < 100)

這是因為如果出錯,比如在執行之前i=100,那麼這條語句就不會執行,那麼i++這條命令就沒有執行。

正確: assert(i < 100)

i++;

4)assert和後面的語句應空一行,以形成邏輯和視覺上的一致感

5)有的地方,assert不能代替條件過濾

C 程式設計 學習筆記(五)語句

1 條件語句 if condition statement elseif condition statement else statement 2 switch語句 switch 變數 case 常量表示式1 statement break case 常量表示式2 statement break d...

Lua 學習筆記(五) 語句

一 賦值 多重賦值 每個值或每個變數之間以逗號分隔 例如 a,b 10,20 lua先對等號右邊的所有元素求值,然後才執行賦值。二 區域性變數和塊 local建立區域性變數,作用域僅限於宣告它們的程式塊。三 控制結構 1.if then else end 例如 2.for 數值型for for va...

Python學習筆記 五 基本語句

python支援迭代賦值。即把乙個序列或可迭代物件中的元素同時賦值給多個變數,如果等號右側含有表示式,會把所有表示式的值先計算出來,然後再進行賦值。多個變數同時賦值 x,y,z 1,2,3 v tuple false,3.5,exp x,y,z v tuple x,y,z v tuple 可以對ra...