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

来源:https://www.cnblogs.com/testing-/archive/2023/05/09/17380617.html
-Advertisement-
Play Games

Listener監聽器,實現一個顯示線上用戶人數 每博一文案 關於後半身,脾氣越溫,福報越深。 師傅說:惜命最好的方式不是養生,而是管好自己的情緒。 壞毛病都是慣出來的,但好脾氣都是磨出來的,與人生氣,傷的是和氣,與自己生氣,傷的是身體。 佛說:人有五毒心,貪嗔痴慢疑,其中一時的嗔念起,百萬葉障深, ...


快速入門

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

釘釘或微信號: pythontesting 微信公眾號:pythontesting
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 在C語言中,有三種條件判斷結構:if語句、if-else語句和switch語句。 一、人物簡介 第一位閃亮登場,有請今後會一直教我們C語言的老師 —— 自在。 第二位上場的是和我們一起學習的小白程式猿 —— 逍遙。 二、if語句 基本語法 if (條件) { // 代碼塊1 } 代碼示例 #i ...
  • 併發編程的意義是充分的利用處理器的每一個核,以達到最高的處理性能,可以讓程式運行的更快。而處理器也為了提高計算速率,作出了一系列優化 ...
  • 前言 從今天開始本系列就帶各位小伙伴學習資料庫技術。資料庫技術是Java開發中必不可少的一部分知識內容。也是非常重要的技術。本系列教程由淺入深, 全面講解資料庫體系。 非常適合零基礎的小伙伴來學習。 全文大約 【1707】 字,不說廢話,只講可以讓你學到技術、明白原理的純乾貨!本文帶有豐富案例及配圖 ...
  • 目錄 什麼是 SQL,它的用途是什麼? SQL 在 2023 年仍然適用嗎? 你應該學習 SQL 嗎? 學習 SQL 的不同方法 SQL 入門 SQL初學者可能害怕問的問題 學習 SQL 的先決條件是什麼,我需要有任何編碼經驗嗎? SQL 有哪些實際應用,哪些行業依賴於此技能? 學習SQL需要多長時 ...
  • 大數據時代,各行各業對數據採集的需求日益增多,網路爬蟲的運用也更為廣泛,越來越多的人開始學習網路爬蟲這項技術,K哥爬蟲此前已經推出不少爬蟲進階、逆向相關文章,為實現從易到難全方位覆蓋,特設【0基礎學爬蟲】專欄,幫助小白快速入門爬蟲,本期為自動化工具 Pyppeteer 的使用。 概述 前兩期文章中已 ...
  • make 備忘清單 make是一條電腦指令,是在安裝有GNU Make的電腦上的可執行指令。該指令是讀入一個名為makefile [1] 的文件,然後執行這個文件中指定的指令。 Make可以從一個名為makefile的文件中獲得如何構建你所寫程式的依賴關係,Makefile中列出了每個目標文件以 ...
  • Markdown 備忘清單 Markdown 是一種輕量級標記語言,創始人為約翰·格魯伯(John Gruber)。 它允許人們使用易讀易寫的純文本格式編寫文檔,然後轉換成有效的 XHTML(或者HTML)文檔。這種語言吸收了很多在電子郵件中已有的純文本標記的特性。 由於 Markdown 的輕量化 ...
  • Applicationcontext的功能拓展主要來自於不屬於beanfactory的介面,主要包括四個介面 Messagesource :國際化 ResourcePatternResolver :獲取資源 ApplicationEventPublisher:發佈事件 EnvironmentCapa ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...