主頁 > 後端開發 > C語言快速入門教程1快速入門 2指令 3條件選擇

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

2023-05-10 10:23:23 後端開發

快速入門

什么是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' '='

參考資料

  • 本文涉及的python測驗開發庫 謝謝點贊! https://github.com/china-testing/python_cn_resouce
  • python精品書籍下載 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • 本書英文原版: Let Us C Authentic Guide to C Programming Language (17th Edition) -2020 A4.5-804 p485.epub

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()都會被執行,記住,編譯器不會指出這是一個錯誤,因為就語法而言,沒有出錯,但邏輯肯定出錯了,

釘釘或微信號: pythontesting 微信公眾號:pythontesting

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/552080.html

標籤:C

上一篇:高效c語言1快速入門

下一篇:返回列表

標籤雲
其他(158756) Python(38124) JavaScript(25412) Java(18024) C(15225) 區塊鏈(8263) C#(7972) AI(7469) 爪哇(7425) MySQL(7175) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5338) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4570) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2432) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1972) 功能(1967) Web開發(1951) HtmlCss(1934) python-3.x(1918) 弹簧靴(1913) C++(1913) xml(1889) PostgreSQL(1875) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • C語言快速入門教程1快速入門 2指令 3條件選擇

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

    uj5u.com 2023-05-10 10:23:23 more
  • 高效c語言1快速入門

    本章將開發你的第一個C語言程式:傳統的 "Hello, world!"程式。然后討論一些編輯器和編譯器的選項,并闡述移植性問題。 Hello, world! #include <stdio.h> #include <stdlib.h> int main(void) { puts("Hello, wo ......

    uj5u.com 2023-05-10 10:22:59 more
  • 怎樣成為優秀的后端工程師

    本文翻譯自國外論壇 medium,原文地址:https://medium.com/@pradeesh-kumar/how-to-become-a-good-backend-engineer-9da75202a104 讓我們一起看看國外開發者認為優秀后端工程師需要掌握哪些技能。 誰是后端工程師? 本質 ......

    uj5u.com 2023-05-10 07:38:38 more
  • Django筆記三十九之settings配置介紹

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記三十九之settings配置介紹 這一篇筆記介紹 Django 里 settings.py 里一些常用的配置項,這些配置有一些是在之前的筆記中有過介紹的,比如 logging 的日志配置,session 的會話配置等,這里就只做一下簡單的 ......

    uj5u.com 2023-05-10 07:37:28 more
  • 【redis】哨兵監控原理

    redis-主從模式弊端: 一、master節點例外shutdown后,從機原地待命,從機資料可以查詢(不可以寫入),等待主機重啟歸來 二、復制延時,信號衰減 redis-哨兵監控: 是什么? 哨兵即為吹哨人,可以巡查監控后臺master主機是否故障,如果故障可以根據投票數自動將一個從庫轉換為新的m ......

    uj5u.com 2023-05-10 07:32:04 more
  • 實驗五 Java多執行緒程式設計

    實驗五 Java多執行緒程式設計

    實驗目的
    1. 掌握Runnable介面實作多執行緒的方法
    2. 掌握Thread類實作多執行緒的用法
    3. 掌握Java語言中多執行緒編程的基本方法 ......

    uj5u.com 2023-05-10 07:26:53 more
  • 分享一個提高運維效率的 Python 腳本

    哈嘍大家好我是咸魚,今天給大家分享一個能夠提升運維效率的 python 腳本 咸魚平常在作業當中通常會接觸到下面類似的場景: 容災切換的時候批量對機器上的組態檔內容進行修改替換 對機器批量替換某個檔案中的欄位 對于 Linux 機器,咸魚可以寫個 shell 腳本或者直接批量使用 sed 命令就能 ......

    uj5u.com 2023-05-10 07:26:45 more
  • Spring AOP官方檔案學習筆記(四)之Spring AOP的其他知識點

    1.選擇哪種AOP (1) 使用Spring AOP比使用完整版的AspectJ更方便簡單,因為不需要在開發和構建程序中引入AspectJ編譯器以及織入器,如果我們只希望通知能夠在Spring Bean上執行,那么選用Spring AOP就可以了,如果我們希望通知能夠在不由Spring所管理的物件上 ......

    uj5u.com 2023-05-10 07:26:24 more
  • 關于并發編程與執行緒安全的思考與實踐

    并發編程的意義是充分的利用處理器的每一個核,以達到最高的處理性能,可以讓程式運行的更快。而處理器也為了提高計算速率,作出了一系列優化 ......

    uj5u.com 2023-05-10 07:21:07 more
  • 由淺入深學MySQL之事務全攻略

    前言 從今天開始本系列就帶各位小伙伴學習資料庫技術。資料庫技術是Java開發中必不可少的一部分知識內容。也是非常重要的技術。本系列教程由淺入深, 全面講解資料庫體系。 非常適合零基礎的小伙伴來學習。 全文大約 【1707】 字,不說廢話,只講可以讓你學到技術、明白原理的純干貨!本文帶有豐富案例及配圖 ......

    uj5u.com 2023-05-10 07:19:57 more