C語言快速入門教程1快速入門 2指令 3條件選擇

磁石空杯發表於2023-05-09

快速入門

什麼是C語言?

C是一種程式語言,1972年由Dennis Ritchie在美國AT & T的貝爾實驗室開發。C語言變得很流行,因為它很簡單,很容易使用。今天經常聽到的一個觀點是--"C語言已經被C++、Python和Java等語言所取代,所以今天何必再去學習C語言"。我很不贊同這種觀點。這有幾個原因。這些原因如下:

(a) C++、Python和Java等語言所取代或Java利用一種叫做物件導向程式設計(OOP)的原則來組織程式,這有很多好處。在使用這種組織原則時,你需要基本的程式設計技能。因此,首先學習C語言,然後遷移到C++、C#或Java更有意義。雖然這種兩步走的學習過程可能需要更多的時間,但在結束時,你一定會發現它值得一試。

(b) 流行的作業系統,如Windows、UNIX、Linux和Android的主要部分都是用C語言編寫的。此外,如果要擴充套件作業系統以與新裝置一起工作,就需要編寫裝置驅動程式。這些程式完全是用C語言編寫的。

(c) 像微波爐、洗衣機和數位相機這樣的普通消費裝置正變得越來越智慧。這種智慧來自於這些裝置中嵌入的微處理器、作業系統和程式。這些程式必須快速執行並在有限的記憶體中工作。C語言是建立這種作業系統和程式時的首選語言。

(d) 你一定見過一些專業的3D電腦遊戲,使用者在遊戲中瀏覽一些物體,比如說一艘宇宙飛船,向入侵者發射子彈。所有這類遊戲的本質是速度。為了滿足這種對速度的期望,遊戲必須對使用者的輸入做出快速反應。用於建立此類遊戲的流行遊戲框架(如DirectX)是用C語言編寫的。

學習C語言的步驟

學習英語和學習C語言之間存在著密切的相似性。

image

image

常量、變數和關鍵詞

當字母、數字和特殊符號恰當地結合在一起時,就形成了常數、變數和關鍵詞。常量是不改變的實體,而變數是可能改變的實體。關鍵字是具有特殊含義的詞。在程式語言中,常量通常被稱為字面量,而變數則被稱為識別符號。現在讓我們看看C語言中存在哪些不同型別的常量和變數。

C語言常量的型別

C語言中的常量可分為兩大類:
(a) 主要常量
(b) 次要常量

這些常量可進一步分類。

image

在這個階段,我們將只討論初級常量,即整數、實數和字元常量。以下是構建這些不同型別常量的規則:

  • 構造整數常數的規則

(a) 整數常數必須至少有一個數字。
(b) 它不能有小數點。
(c) 它可以是零、正或負的任何一種。如果一個整數常數前面沒有符號,則假定它是正數。
(d) 整數常數內不允許有逗號或空號。
(e) 整數常數的允許範圍是-2147483648到+2147483647。

例如:+325.34 426.0 -32.76 -48.5792

實際上,整數常數的範圍取決於編譯器。對於像Visual Studio, GCC這樣的編譯器,範圍是-2147483648到+2147483647,而對於像Turbo C或Turbo C++這樣的編譯器,範圍是-32768到+32767。

  • 構建實數常量的規則

實數常數通常被稱為浮點常數。實數常量可以寫成兩種形式--小數形式和指數形式。在構建小數形式的實數常數時必須遵守以下規則:

(a) 實數常數必須至少有一個數字。
(b) 它必須有一個小數點。
(c) 它可以是正數或負數。預設符號為正。
(d) 實數常數內不允許有逗號或空白。

例如:+325.34 426.0 -32.76 -48.5792

如果常數的值過小或過大,通常會使用指數形式。然而,它並不限制我們對其他實數常數使用指數形式。

在指數形式中,實數常數由兩部分組成。出現在'e'之前的部分被稱為尾數,而'e'之後的部分被稱為指數。因此,0.000342可以用指數形式寫成3.42e-4(在普通算術中意味著3.42 x 10-4)。

在構建以指數形式表示的實數常數時必須遵守以下規則:

(a) 尾數部分和指數部分應以字母e或E分開。
(b) 尾數部分可以有正號或負號。預設符號為正。
(c) 指數必須至少有一個數字,可以是正數或負數的整數。預設符號為正。
(d) 用指數形式表示的實數常數的範圍是-3.4e38到3.4e38。

例:+3.2e-5 4.1e8 -0.2E+3 -3.2e-5

  • 構建字元常量的規則

(a) 字元常量是字母、數字或特殊符號,包含在單引號內。
例如:'A' 'I' '5' '='

參考資料

https://url97.ctfile.com/f/18113597-853620132-541682 下載密碼 訂閱號pythontesting 傳送 密碼 。

C語言變數的型別

一個特定型別的變數只能容納同一型別的常數。例如,一個整數變數只能容納一個整數常數,一個實數變數只能容納一個實數常數,一個字元變數只能容納一個字元常數。因此,C語言中變數的型別和常量的型別一樣多。

在任何C語言程式中,都要進行許多計算。這些計算的結果被儲存在計算機記憶體的一些單元(位置)中。為了便於檢索和使用這些數值,記憶體單元被賦予了名稱。由於儲存在每個位置的值可能會發生變化,所以給這些位置的名稱被稱為變數名稱。

構建不同型別常量的規則是不同的。然而,對於構建所有型別的變數名,同樣的規則適用。

  • 構建變數名稱的規則

(a) 變數名稱是1到31個字母、數字或下劃線的任何組合。有些編譯器允許變數名的長度可以達到247個字元。不要建立不必要的長的變數名,因為它增加了你的打字工作量。

(b) 變數名的第一個字元必須是字母或下劃線(_)。

例如:si_int pop_e_89 avg basic_salary

我們應該始終建立有意義的變數名稱。例如,在計算單利的時候,我們應該建立像prin, roi, noy這樣的變數名來表示原則、利率和年數,而不是像a, b, c這樣的任意變數。

建立變數名稱的規則對於所有型別的主要變數和次要變數都是一樣的。因此,為了幫助區分變數,必須宣告我們希望在程式中使用的任何變數的型別。這種型別的宣告是如下所示。

例如

int si, m_hra;

float bassal;

char code;

C語言的關鍵字

關鍵字是指那些已經向C語言編譯器(或廣義上的計算機)解釋過含義的詞。C語言中只有32個關鍵詞。

image

這些關鍵字不應作為變數名使用。然而,一些 C 編譯器允許你構建與這些關鍵字完全相似的變數名。

編譯器供應商還提供了更多的關鍵字。儘管ANSI委員會建議這樣的編譯器特定的關鍵字都應該在前面加上兩個下劃線(如___asm),但並不是每個廠商都遵守這個規則。

第一個C語言程式

一旦掌握了變數、常量和關鍵字的知識,下一個合乎邏輯的步驟就是將它們組合成指令。然而,我們現在要做的不是這樣,而是編寫我們的第一個C語言程式。一旦我們完成了這一工作,我們將詳細瞭解它所使用的指令。

第一個程式非常簡單。它為一組代表本金、年數和利率的數值計算單利。

void main()
{
	int   p, n ;
	float   r, si ; 

	p = 1000 ;
	n = 3 ;
	r = 8.5 ;

	/* formula for simple interest */
	si = p * n * r / 100 ;  

	printf ( "%f" , si ) ;
} 
  • C語言程式的形式

(a) C語言程式中的每條指令都被寫成一個單獨的語句。
(b) 程式中的語句必須按照我們希望它們被執行順序出現。
(c) 兩個字之間可以插入空白,以提高語句的可讀性。
(d) 所有語句都應使用小寫字母。
(e) 每個C語句必須以分號(;)結束。因此,;作為語句的結束符。
(f) C語句可以寫在指定行的任何地方。這就是為什麼它經常被稱為自由形式的語言。
(g) 通常每一行包含一條語句。然而,你可以在一行中寫多個語句,只要每個語句以;結束。

  • C語言程式中的註釋

C語言程式中的註釋是用來澄清程式的目的或程式中某些語句的目的。一個好的做法是,在程式開始時用註釋說明程式的目的、作者和程式的編寫日期。

下面是在C語言程式中寫註釋的一些提示:

(a) 註釋可以是小寫的,也可以是大寫的,也可以是混合的。它們應該被括在/* */內。因此,我們程式中的前兩條語句就是註釋。
(b) 有時,程式中某一特定語句的作用並不十分明顯。在這種情況下,可以用註釋來提及該語句的目的。
(c) 任何數量的註釋都可以寫在程式的任何地方。因此,註釋可以寫在語句之前、語句之後或語句之內。
(d) 註釋不能被巢狀。這意味著一個註釋不能寫在另一個註釋裡面。所以下面的註釋是無效的。
(e) 註釋可以分割成多行。
(f) ANSI C允許用另一種方式來寫註釋,如下:

// Calculation of simple interest

// Formula
  • 什麼是main()?

(a) main()是一個函式。它是一組語句的容器。一個C語言程式可以有多個函式。如果它只包含一個函式,其名稱必須是main()。所有屬於main()的語句都包含在一對大括號{}中。
(b) 像計算器中的函式一樣,C語言中的函式也會返回一個值。 main()函式總是返回一個整數值,因此在main()前面有一個int。這被稱為該函式的返回型別。我們要返回的整數值是0,0表示成功。如果main()中的語句未能完成其預期的工作,我們可以從main()中返回一個非零的數字。這將表示失敗。

(c) 觀察main()返回值的方式在不同的編譯器中有所不同,如下所示。

Turbo C, Turbo C++ - Alt C | 資訊
Visual Studio - 偵錯程式觀察視窗中的$ReturnValue
Linux - 在程式執行後的命令提示符中回顯$?

(d) 有些編譯器如Turbo C/C++甚至允許我們從main()中不返回任何東西。在這種情況下,我們應該在它前面加上關鍵字void。但這是寫main()函式的非標準方式。

  • 變數和它們的用法

(a) 程式中使用的任何變數必須在使用前宣告。例如、

(b) C語言中可用的算術運算子是+、-、*和/。

  • printf()和它的用途

C語言不包含任何在螢幕上顯示輸出的關鍵字。所有對螢幕的輸出都是透過庫函式如printf()實現的。

(a) 一旦si的值被計算出來,它就需要顯示在螢幕上。我們使用了printf()來實現這一目的。

(b) 為了能夠使用printf()函式,有必要在程式的開頭使用#include <stdio.h>。#include是一個前處理器指令
(c) printf()函式的一般形式是

printf (“<format string>”, <list of variables>);

format string可以包含:
%f用於列印實數值
%d用於列印整數值
%c用於列印字元值

除了像%f、%d和%c這樣的格式指定符外,格式字串還可以包含任何其他字元。這些字元在執行printf()時被列印出來。

(d) 下面是一些使用printf()函式的例子:

printf (“%f”, si);

printf (“%d %d %f %f”, p, n, r, si);

printf (“Simple interest = Rs. %f”, si);

printf (“Principal = %d\nRate = %f”, p, r);

最後一條語句的輸出會是這樣的...

Principal = 1000

Rate = 8.500000

由於換行符'\n'的存在,輸出被分成了兩行。它把游標送到了下一行。它是C語言中可用的幾個轉義序列之一。

(e) printf()可以列印變數的值以及表示式的結果,如3、3+2、c和a+b*c-d,如下所示。

printf (“%d %d %d %d”, 3, 3 + 2, c, a + b * c - d);

請注意,3和c也代表有效的表示式。

  • 編譯和執行

一旦你寫好了程式,你需要輸入它並指示機器執行它。要做到這一點,還需要兩個程式--編輯器和編譯器。編輯器讓我們輸入程式,而編譯器將我們的程式轉換為機器語言程式。這種轉換是必要的,因為機器只能理解機器語言。

除了這兩個程式外,還有其他程式,你可能需要它們來提高你的程式設計效率--前處理器、連結器和偵錯程式。單獨使用它們中的每一個都是一項乏味的工作。因此,通常所有這些程式都被捆綁在一起,在它們上面有一層圖形使用者介面。GUI使你更容易使用這些程式。這種捆綁通常被稱為整合開發環境(IDE)。

有許多IDE可用。每個都是針對不同的作業系統和微處理器的。

[Running] cd "/home/andrew/code/SourceCode/Source Code/Chap01/" && gcc doc1.c -o doc1 && "/home/andrew/code/SourceCode/Source Code/Chap01/"doc1
255.000000
[Done] exited with code=10 in 0.044 seconds

接收輸入

#include <stdio.h>

int main( )
{
	int   p, n ;
	float   r, si ;
	printf ( "Enter values of p, n, r\n" ) ;
	scanf ( "%d %d %f", &p, &n, &r ) ;

	si = p * n * r / 100 ;
	printf ( "%f" , si ) ;
}

執行

$ ./doc2
Enter values of p, n, r
1000 5 3.5

第一個printf()在螢幕上輸出 "輸入p、n、r的值 "的資訊。這裡我們沒有在printf()中使用任何表示式,這意味著在printf()中使用表示式是可選的。

注意在scanf()函式中的變數前使用&是必要的,&是 "地址 "運算子。它給出變數在記憶體中使用的位置號(地址)。當我們說&a時,我們在告訴scanf()應該在哪個記憶體位置儲存使用者從鍵盤提供的值。

請注意,在提供給scanf()的數值之間必須有一個空白、一個製表符或一個新行。空白用空格鍵建立,製表符用Tab鍵,換行用Enter鍵。

指令

指令的型別

在C語言中,有三種型別的指令:

(a) 型別宣告指令 - 該指令用於宣告C語言程式中使用的變數的型別。

(b) 算術指令 - 該指令用於對常數和變數進行算術運算。

(c) 控制指令 - 該指令用於控制C語言程式中各種語句的執行順序。

型別宣告指令

這條指令用於宣告程式中使用的變數的型別。型別宣告語句寫在main()函式的開頭。下面是幾個例子。


int bas;

float rs, grosssal;

char name, code;

下面是型別宣告指令的一些微妙變化......

(a) 在宣告變數型別的同時,我們也可以對其進行初始化,如下所示。


int bas;

float rs, grosssal;

char name, code;

(b) 在使用一量之前必須先定義它。下面的語句是非法的,因為我們在定義變數a之前就使用了它。


int i = 10, j = 25;

float a = 1.5, b = 1.99 + 2.4 * 1.44;

(c) 下面的語句可以工作


int a, b, c, d;

a = b = c = 10;

然而,下面的語句將不工作


int a = b = c = d = 10;

算術指令

C語言中的算術指令由=左邊的變數名和=右邊使用運算子連線的變數名和常陣列成。


int ad;

float kot, deta, alpha, beta, gamma;

ad = 3200;

kot = 0.0056;

deta = alpha * beta / gamma + 3.2 * 2 / 5;

*, /, -, +是算術運算子。
= 是賦值運算子。
2、5和3200是整數常數。
3.2和0.0056是實數常數。
ad是一個整數變數。
kot, deta, alpha, beta, gamma是實數變數。

變數和常數一起被稱為 "運算元"。在執行算術語句時,右手邊的運算元由 "算術運算子 "操作,結果用賦值運算子分配給左手邊的變數。

C語言中的算術語句可以有三種型別。這些型別如下:

(a) 整數模式算術語句--在這個語句中,所有運算元都是整數變數或整數常數。

int i, king, issac, noteit;

i = i + 1;

king = issac * 234 + noteit - 7689;

(b) 真實模式算術語句--在該語句中,所有運算元都是實數常數或實數變數。

float qbee, antink, si, prin, anoy, roi;

qbee = antink + 23.123 / 4.5 * 0.3442;

si = prin * anoy * roi / 100.0;

(c) 混合模式算術語句 - 在這個語句中,一些運算元是整數,一些運算元是實數。

float si, prin, anoy, roi, avg;

int a, b, c, num;

si = prin * anoy * roi / 100.0;

avg = (a + b + c + num) / 4;

請仔細注意關於算術指令的以下幾點:

(a) C語言只允許在=的左邊有一個變數,也就是說,z = k * l是合法的,而k * l = z是非法的。

(b) 除了除法運算子之外,C語言還提供了去模運算子。這個運算子返回一個整數除以另一個整數的餘數。因此,表示式10 / 2產生5,而10 % 2則產生0。

請注意,模數運算子(%)不能應用於浮點數。還要注意,在使用%時,餘數的符號總是與分子的符號相同。因此,-5 % 2的結果是-1,而5 % -2的結果是1。

(c) 算術運算可以在整數、浮點數和字元上進行。因此,下面的語句是有效的。

char x = ’a’, y = ’b’;

int z = x + y;

ASCII程式碼用於表示記憶體中的任何字元。a "和 "b "的ASCII程式碼是01100001和01100010。它們的十進位制等價物是97和98。加法是在這些十進位制值上進行的,而不是在字元本身上。

(d) 沒有假定存在運算子。它必須明確地寫出來。在下面的例子中,b後面的乘法運算子必須明確地寫出來。

a = c.d.b(xy) usual arithmetic statement

a = c * d * b * (x * y) C statement

(e) C語言中沒有運算子來進行指數化操作。指數運算必須按以下方式進行:

#include <stdio.h>
#include <math.h>
void main()
{
	float a;
	
	a = pow(3.0, 2.0);
	printf("%f", a);
} 

執行結果

9.000000

這裡pow()函式是一個標準庫函式。它被用來將3.0的2.0的冪。pow()函式只對實數工作,因此我們使用了3.0和2.0。

請注意,為了使pow()函式工作,有必要#include <math.h>。

你可以自己探索其他數學函式,如abs()、sqrt()、sin()、cos()、tan()等,這些函式在math.h中宣告。

整數和浮點數的轉換

(a) 整數和整數之間的算術運算總是產生整數的結果。
(b) 實數和實數之間的運算總是產生實數結果。
(c) 整數和實數之間的運算總是產生實數結果。在這個操作中,整數首先被提升為實數,然後再進行操作。因此,其結果是實數。

image

賦值中的型別轉換

如果兩邊表示式的型別不一樣,那麼右邊上的表示式的值就會被提升或降低,這取決於=左邊的變數的型別。 例如,考慮以下賦值語句:

int i;

float b;

i = 3.5;

b = 30;

在第一條賦值語句中,雖然3.5是一個浮點數,但由於它是一個int,所以不能被儲存在i中。因此,3.5(浮點數)被降級為3(int),然後儲存在i中。在這裡,30被提升為30.0,然後儲存在b中。

如果出現複雜的表示式,仍然適用同樣的規則。例如,考慮下面的程式片段。

運算子優先順序

如果有一組以上的括號,最裡面的括號內的操作將首先被執行,然後是最裡面的第二組括號內的操作,以此類推。

一些代數表示式及其等價的C語言表示式的例子見圖

運算子的相關性

當一個表示式包含兩個優先順序相同的運算子時,它們之間的平局將透過運算子的相關性來解決。C語言中的所有運算子都有從左到右的相關性或從右到左的相關性。讓我們藉助幾個例子來理解這一點。

考慮一下這個表示式:a = 3 / 2 * 5;

這裡有一個相同優先順序的運算子之間的平局,即在/和之間。這個平局是利用/和的關聯性來解決的。兩者都享有從左到右的關聯性。因此,首先進行的是/操作,然後是*。

再考慮一個表示式:a = b = 3;
這裡,兩個賦值運算子都有相同的優先順序。所以操作的順序是由=運算子的關聯性決定的。因此,第二個=比第一個=早執行。

再考慮另一個表示式:z = a * b + c / d;

這裡和/享有相同的優先順序和相同的關聯性(從左到右)。編譯器可以根據自己的需要自由地執行或/操作,因為無論哪個操作在前面執行,結果都是一樣的。

控制指令

控制指令控制程式中指令的執行順序。換句話說,控制指令決定了程式中的 "控制流"。在C語言中,有四種型別的控制指令,它們是

(a) 順序控制指令
(b) 選擇或決定控制指令
(c) 重複或迴圈控制指令
(d) case控制指令

順序控制指令確保指令按照它們在程式中出現的相同順序執行。決定和case控制指令允許計算機決定下一步執行哪個指令。迴圈控制指令有助於重複執行一組語句。

條件控制

if - else語句

C語言使用關鍵字if和else來實現決策控制指令。這個語句的一般形式是這樣的:

if (this condition is true)

statement1;

else

statement2;

關鍵字if後面的條件總是包含在一對小括號內。如果該條件為真,則執行語句1。如果條件不為真,則執行語句2。條件是用C語言中的 "關係 "運算子表示的,這些運算子允許我們比較兩個值。圖3.1顯示了它們在C語言中的外觀和評估方式。

這裡是等於運算子,!=是不等運算子。請注意,=用於賦值,而則用於兩個量的比較。

例3.1: 在購買某些物品時,如果購買的數量超過1000件,可以享受10%的折扣。如果透過鍵盤輸入每件物品的數量和價格,寫一個程式來計算總的費用。

#include <stdio.h>
int main()

{

    int qty, dis;
    float rate, tot;
    printf ("Enter quantity and rate:");
    scanf ("%d %f", &qty, &rate);

    if (qty > 1000)
        dis = 10;
    else
        dis = 0;

    tot = (qty * rate) - (qty * rate * dis / 100);
    printf ("Total expenses = Rs. %f\n", tot);
    return 0;
}

下面是一些與程式互動的例子。

Enter quantity and rate 1200 15.50

Total expenses = Rs. 16740.000000

 
 
 
Enter quantity and rate 200 15.50

Total expenses = Rs. 3100.000000

在if-else中的多條語句

在一個程式中,當if後面的表示式得到滿足時,我們可能要執行一個以上的語句。如果要執行這樣的多條語句,就必須把它們放在一對大括號內,如下面的例子所示:

例3.2:在一家公司裡,一個僱員的工資如下:

如果他的基本工資低於1500盧比,那麼HRA=基本工資的10%,DA=基本工資的90%。如果他的工資等於或高於1500盧比,那麼HRA=500盧比,DA=基本工資的98%。如果員工的工資是透過鍵盤輸入的,那麼寫一個程式來找出他的工資總額。

實現這一邏輯的程式如下。

/* Calculation of gross salary */
# include <stdio.h>

int main()
{
    float bs, gs, da, hra;
    printf ("Enter basic salary");
    scanf ("%f", &bs);
    if (bs < 1500)
    {
        hra = bs * 10 / 100;
        da = bs * 90 / 100;
    }
    else
    {
        hra = 500;
        da = bs * 98 / 100;
    }

    gs = bs + hra + da;
    printf ("gross salary = Rs. %f\n", gs);
    return 0;
}

關於這個程式,有幾點值得注意...

(a) if之後到else為止的一組語句被稱為 "if塊"。同樣,else之後的語句構成 "else塊"。

(b) 注意,else正好寫在if的下面。if塊中的語句和else塊中的語句都是向右縮排的。

(c) 如果在if塊中只執行一條語句,在else塊中只執行一條語句,我們可以放棄這對大括號。

(d) if和else的預設範圍是緊隨其後的語句。要覆蓋這個預設範圍,必須使用一對大括號。

巢狀的if-elses

如果我們在if塊或else塊中再寫一個if-else結構,這是完全可以的。這被稱為 "巢狀",在下面的程式碼片段中顯示:

if (i == 1)
	printf (“You would go to heaven !\n”);
else
{
	if (i == 2)
		printf (“Hell was created with you in mind\n”);
	else
		printf (“How about mother earth !\n”);
}

注意第二個if-else結構是巢狀在第一個else塊中的。如果第一個if中的條件是假的,那麼第二個if中的條件將被檢查。如果它也是假的,那麼第二個else將被執行。

你可以觀察到,每次if-else結構巢狀在另一個if-else結構中時,它也會縮排,以增加程式的清晰度。培養這種縮排的習慣;否則,你最終寫出的程式將沒有人(包括你)能夠在以後的日子裡輕鬆理解。請注意,無論我們縮排還是不縮排程式,都不會改變程式中指令的執行流程。

在上面的程式中,if-else發生在第一個if語句的 "else塊 "中。同樣,在其他一些程式中,if-else也可能出現在 "if塊 "中。對於if和else的巢狀深度沒有限制。

注意事項

儘管通常在if語句中使用一個條件,但任何有效的表示式也可以。因此,以下所有的if語句都是有效的。

if (3 + 2 % 5)
	printf (“This works”);
if (a = 10)
	printf (“Even this works”);
if (-5)
	printf (“Surprisingly even this works”);

請注意,在C語言中,非零值被認為是真,而0被認為是假。在第一個if中,表示式評估為5,由於5是非零值,所以它被認為是真的。因此printf()被執行。

在第二個if中,10被分配給a,所以現在的if被簡化為if(a)或if(10)。由於10是非零,它是真的,因此printf()又開始工作了。

在第三個if中,-5是一個非零數,因此是真的。所以printf()又開始工作了。即使使用3.14這樣的浮點數來代替-5,也會被認為是真的。所以問題不在於這個數字是整數還是浮點數,也不在於它是正數還是負數。問題是它是零還是非零。

在使用if語句時,另一個常見的錯誤是在條件後面寫一個分號(;),如下所示。

if (i == 1)
	scanf (“%d”, &i);

if (i == 5);
	printf (“You entered 5\n”);

這使編譯器將該語句解釋為你是以如下方式寫的:

if (i == 5)

;

printf (“You entered 5\n”);

在這裡,如果條件評估為真,就會執行;(空語句,執行時不做任何事情),接著執行printf()。如果條件失敗,則直接執行printf()。因此,無論條件的評估結果是真還是假,printf()都會被執行。記住,編譯器不會指出這是一個錯誤,因為就語法而言,沒有出錯,但邏輯肯定出錯了。

相關文章