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語言之間存在著密切的相似性。
常量、變數和關鍵詞
當字母、數字和特殊符號恰當地結合在一起時,就形成了常數、變數和關鍵詞。常量是不改變的實體,而變數是可能改變的實體。關鍵字是具有特殊含義的詞。在編程語言中,常量通常被稱為字面量,而變數則被稱為標識符。現在讓我們看看C語言中存在哪些不同類型的常量和變數。
C語言常量的類型
C語言中的常量可分為兩大類:
(a) 主要常量
(b) 次要常量
這些常量可進一步分類。
在這個階段,我們將只討論初級常量,即整數、實數和字元常量。以下是構建這些不同類型常量的規則:
- 構造整數常數的規則
(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個關鍵詞。
這些關鍵字不應作為變數名使用。然而,一些 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) 整數和實數之間的運算總是產生實數結果。在這個操作中,整數首先被提升為實數,然後再進行操作。因此,其結果是實數。
賦值中的類型轉換
如果兩邊表達式的類型不一樣,那麼右邊上的表達式的值就會被提升或降低,這取決於=左邊的變數的類型。 例如,考慮以下賦值語句:
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