一、程序結(jié)構(gòu)
C 程序主要包括以下部分:
預(yù)處理器指令
函數(shù)
變量
語句 & 表達(dá)式
注釋
一個(gè)簡單的程序
#include <stdio.h>
int main()
{
/* 我的第一個(gè) C 程序 */
printf("Hello, World! \n");
return 0;
}
程序解釋
1.程序的第一行 #include <stdio.h> 是預(yù)處理器指令,告訴 C 編譯器在實(shí)際編譯之前要包含 stdio.h 文件。
2.下一行 int main() 是主函數(shù),程序從這里開始執(zhí)行。
3.下一行 /*...*/ 將會(huì)被編譯器忽略,這里放置程序的注釋內(nèi)容。它們被稱為程序的注釋。
4.下一行 printf(...) 是 C 中另一個(gè)可用的函數(shù),會(huì)在屏幕上顯示消息 "Hello, World!"。
5.下一行 return 0; 終止 main() 函數(shù),并返回值 0。
數(shù)據(jù)類型
類型 存儲大小 值范圍
char 1 字節(jié) -128 到 127 或 0 到 255
unsigned char 1 字節(jié) 0 到 255
signed char 1 字節(jié) -128 到 127
int 2 或 4 字節(jié) - 32,768 到 32,767 或 -2,147,483,648 到2,147,483,647
unsigned int 2 或 4 字節(jié) 0 到 65,535 或 0 到 4,294,967,295
short 2 字節(jié) -32,768 到 32,767
unsigned short 2 字節(jié) 0 到 65,535
long 4 字節(jié) -2,147,483,648 到 2,147,483,647
unsigned long 4 字節(jié) 0 到 4,294,967,295
整型(基本型):類型說明符為int,在內(nèi)存中占2個(gè)字節(jié)。
短整型:類型說明符為short int或short。所占字節(jié)和取值范圍均與整型(基本型)相同。
長整型:類型說明符為long int或long,在內(nèi)存中占4個(gè)字節(jié)。
無符號型:類型說明符為unsigned。
無符號型又可與上述三種類型匹配而構(gòu)成:
單精度(float型)、雙精度(double型)和長雙精度(long double型)三類。
單精度型占4個(gè)字節(jié)(32位)內(nèi)存空間,其數(shù)值范圍為3.4E-38~3.4E+38,只能提供七位有效數(shù)字
雙精度型占8 個(gè)字節(jié)(64位)內(nèi)存空間,其數(shù)值范圍為1.7E-308~1.7E+308,可提供16位有效數(shù)字。
長雙精度型16 個(gè)字節(jié)(128位)內(nèi)存空間,可提供18-19位有效數(shù)字。
常見常用符號
\b 退格(當(dāng)前位置啊后退一個(gè)字符)
\f 走紙換頁(當(dāng)前位置移到下一頁的開頭)
\n 換行(當(dāng)前位置移到下一行的開頭)
\r 回車(當(dāng)前位置移到本行的開頭)
%d 整型(有符號10進(jìn)制) int
%c 字符型 char
%f 浮點(diǎn)型(單精度) float
%lf 浮點(diǎn)型(雙精度) double
%s 字符串型
%ld 長整型 long int
%lld 長整型 long long
%llu 無符號長整型 unsigned long long
%o或%O 無符號8進(jìn)制型
%x或%X 無符號16進(jìn)制型
%e或%E 指數(shù)型
二、 變量與常量
變量定義: 就是告訴編譯器在何處創(chuàng)建變量的存儲,以及如何創(chuàng)建變量的存儲。變量定義指定一個(gè)數(shù)據(jù)類型,并包含了該類型的一個(gè)或多個(gè)變量的列表
變量的名稱:可以由字母、數(shù)字和下劃線字符組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因?yàn)?C 是大小寫敏感的。另外定義的變量不能是C語言中的關(guān)鍵字 例如變量不能是int double等見一個(gè)記一個(gè)就行了
常量: 是固定值,在程序執(zhí)行期間不會(huì)改變。這些固定的值,又叫做字面量。常量可以是任何的基本數(shù)據(jù)類型,比如整數(shù)常量、浮點(diǎn)常量、字符常量,或字符串字面值,也有枚舉常量。
常量就像是常規(guī)的變量,只不過常量的值在定義后不能進(jìn)行修改。
整數(shù)常量: 可以是十進(jìn)制、八進(jìn)制或十六進(jìn)制的常量。前綴指定基數(shù):0x 或 0X 表示十六進(jìn)制,0 表示八進(jìn)制,不帶前綴則默認(rèn)表示十進(jìn)制。
整數(shù)常量也可以帶一個(gè)后綴,后綴是 U 和 L 的組合,U 表示無符號整數(shù)(unsigned),L 表示長整數(shù)(long)。后綴可以是大寫,也可以是小寫,U 和 L 的順序任意。
浮點(diǎn)常量: 浮點(diǎn)常量由整數(shù)部分、小數(shù)點(diǎn)、小數(shù)部分和指數(shù)部分組成。您可以使用小數(shù)形式或者指數(shù)形式來表示浮點(diǎn)常量。
當(dāng)使用小數(shù)形式表示時(shí),必須包含整數(shù)部分、小數(shù)部分,或同時(shí)包含兩者。當(dāng)使用指數(shù)形式表示時(shí), 必須包含小數(shù)點(diǎn)、指數(shù),或同時(shí)包含兩者。帶符號的指數(shù)是用 e 或 E 引入的。
下面列舉幾個(gè)整數(shù)常量的實(shí)例:
212 /* 合法的 */
215u /* 合法的 */
0xFeeL /* 合法的 */
078 /* 非法的:8 不是八進(jìn)制的數(shù)字 */
032UU /* 非法的:不能重復(fù)后綴 */
以下是各種類型的整數(shù)常量的實(shí)例:
85 /* 十進(jìn)制 */
0213 /* 八進(jìn)制 */
0x4b /* 十六進(jìn)制 */
30 /* 整數(shù) */
30u /* 無符號整數(shù) */
30l /* 長整數(shù) */
30ul /* 無符號長整數(shù) */
下面列舉幾個(gè)浮點(diǎn)常量的實(shí)例:
3.14159 /* 合法的 */
314159E-5L /* 合法的 */
510E /* 非法的:不完整的指數(shù) */
210f /* 非法的:沒有小數(shù)或指數(shù) */
.e55 /* 非法的:缺少整數(shù)或分?jǐn)?shù) */
對于你定義的變量 變量之間進(jìn)行運(yùn)算時(shí) 期間會(huì)有強(qiáng)制類型轉(zhuǎn)換 下面看一個(gè)例子
#include <stdio.h>
int main()
{
int a=1,c=0;
float b=1.1;
c=a+b;
//變量a和變量b的類型是不一樣的 但由于變量c是整型 所以在會(huì)強(qiáng)制類型轉(zhuǎn)換 結(jié)果取整型
結(jié)果是2 而不是2.1;
printf("%d\n",c);此處的%字母(類型)和你后面輸出的變量是相對應(yīng)的 否則結(jié)果會(huì)是亂碼
return 0;
}
在涉及小數(shù)位數(shù)時(shí) 在%.后寫需要的位數(shù) 例如兩位 %.2f 保留整數(shù)%.0f
字符型數(shù)據(jù): 是指單個(gè)字符,在計(jì)算機(jī)內(nèi)存中占一個(gè)字節(jié),C語言規(guī)定字符常量用單引號括起來。例如:'a','b','c','8',但輸出時(shí)不輸出單引號。
格式說明%c用于輸出一個(gè)字符,字符可以按整形式輸出,而且是以ASCII碼形式來輸出,字符a和A的ASCII碼值分別為97和65。
字符常量可以參與運(yùn)算,表達(dá)式'a'+1的值是字符'a'的ASCII碼值97和1之和。
小寫字母和其對應(yīng)的大寫字母的ASCII碼值之差都是32,沒兩個(gè)字母的ASCII碼值相差1且下寫字母的ASCII碼值是比大寫字母的大的,因此將字母'H'可表示為'h'-32,字母'm'可表示為'M'+32
字符常量是ASCII字符集中的一個(gè)字符,但是有些字符是在鍵盤上找不到的,在程序中使用這些字符的方法是在“\”后加該字符的八進(jìn)制ASCII碼值(最多三位)或在“\x”后加該字符的十六進(jìn)制ASCII碼值(最多兩位)
因此,字符常量有兩種形式:一個(gè)是常規(guī)字符(用單引號括起來的單個(gè)字符),二是轉(zhuǎn)義字符(以“\”開頭的字符序列),字符常量可以按其ASCII碼值參與整數(shù)運(yùn)算,即字符數(shù)據(jù)與整形數(shù)據(jù)可以通用
以"\"開頭的字符序列為轉(zhuǎn)義字符,下列是常用的轉(zhuǎn)義字符
\\ \ 字符
\' ' 字符
\" " 字符
\? ? 字符
\a 警報(bào)鈴聲
\b 退格鍵
\f 換頁符
\n 換行符
\r 回車
\t 水平制表符
\v 垂直制表符
\ooo 一到三位的八進(jìn)制數(shù)
\xhh . . . 一個(gè)或多個(gè)數(shù)字的十六進(jìn)制數(shù)
字符型變量:可以存放ASCII字符集中的任何一個(gè)字符,字符變量在內(nèi)存中占一個(gè)字節(jié)
將常規(guī)字符或轉(zhuǎn)義字符賦給字符變量時(shí)都需要在其兩側(cè)加單引號,但將整形數(shù)據(jù)賦給字符常量時(shí),不能加單引號
轉(zhuǎn)義字符“\0”的ASCII碼值為0
由于字符按其ASCII碼值參與整數(shù)運(yùn)算,因此可以將其運(yùn)算結(jié)果直接賦給整形變量,當(dāng)把一個(gè)字符放在字符變量時(shí),實(shí)際上是將該字符的ASCII碼值存放在變量所帶代表的存儲單元,即變量中的內(nèi)容為該字符的ASCII碼值,因此字符變量可以參加整形數(shù)據(jù)的任何運(yùn)算,
編寫程序時(shí),建議用c作為變量的第一個(gè)字母,表示該變量為字符型
三、輸入和輸出
先寫一個(gè)簡單的輸入輸出程序
#include<stdio.h>
int main()
{
int num;
printf("Please enter a number");
scanf("%d",&num);
printf("You entered %d",num);
return 0;
}
首先要用到輸入輸出函數(shù),就要引用頭文件:#include<stdio.h>
輸入語句:scanf函數(shù)格式:
scanf("格式控制字符串",變量地址);
變量地址代表scanf函數(shù)獲取的是變量的地址(其中&符號為獲取變量的地址),而不是一個(gè)變量的值,通過這個(gè)變量地址,就能找到這個(gè)變量在哪里,從而可以改變這個(gè)變量的值,“%d”是格式控制字符串,表示scanf函數(shù)將接收一個(gè)整數(shù)
在程序運(yùn)行到這里時(shí),會(huì)檢查格式字符串來確定要接收的數(shù)據(jù)類型,然后把鍵盤輸入的值通過&來找到變量從而把值存進(jìn)去
輸出語句:printf函數(shù):
printf(“格式控制字符串”,變量);
這個(gè)的意思就是把變量中的值以“”中的格式輸出到屏幕上
常用的格式控制字符:
由%+特定字符構(gòu)成,如%d表示十進(jìn)制整數(shù),%f表示小數(shù)形式,%c表示單個(gè)字符
普通的字符將原樣輸出
一個(gè)簡單的開平方程序
#include<stdio.h>
#include<math.h> //這個(gè)要加上
int main()
{
int a;
a=sqrt(4); //對4開平方并賦給a
printf("%d",a); // 輸出a的值為2
return 0;
}
四、運(yùn)算符和表達(dá)式
基本的算術(shù)運(yùn)算符: 算術(shù)運(yùn)算符用于各類數(shù)值運(yùn)算 c語言的算術(shù)運(yùn)算符有五種:+(加)-(減)*(乘)/(除)%(求余)
基本算術(shù)運(yùn)算符都是雙目運(yùn)算符,即運(yùn)算符要求有兩個(gè)運(yùn)算量,如:a+b a*b
基本算術(shù)運(yùn)算符優(yōu)先級別和數(shù)學(xué)一樣,遵循原則:先乘除后加減,算術(shù)運(yùn)算符的結(jié)合方向?yàn)樽宰笙蛴?
%運(yùn)算要求運(yùn)算量必須為整形數(shù)據(jù),5%2=1 1%10=1都是正確的,而5/1.0是錯(cuò)誤的
/運(yùn)算時(shí)參與運(yùn)算量均為整形時(shí)結(jié)果也為整形,舍去小數(shù) 5/3=1
加減乘除運(yùn)算時(shí),有一個(gè)數(shù)為實(shí)數(shù)時(shí)結(jié)果為double型 1+2.0=3.0
字符型數(shù)據(jù)可以和數(shù)值型數(shù)據(jù)混合運(yùn)算
算術(shù)表達(dá)式: 由算術(shù)運(yùn)算符和括號把常量.變量.函數(shù)連接起來的式子為算術(shù)表達(dá)式 單個(gè)常量,變量,和函數(shù)可以看做是表達(dá)式的特例 a*b+c/d
算術(shù)表達(dá)式中的變量必須有確定的值
數(shù)學(xué)中的{}和[]再表達(dá)式中不能使用,c只允許使用圓括號,而且可以是多層
如果一個(gè)運(yùn)算符兩側(cè)數(shù)據(jù)類型不同,先自動(dòng)進(jìn)行類型轉(zhuǎn)換,再進(jìn)行運(yùn)算
運(yùn)算符的優(yōu)先級和結(jié)合性:
優(yōu)先級:優(yōu)先級高的先于優(yōu)先級低的進(jìn)行運(yùn)算,和數(shù)學(xué)一樣,先算括號內(nèi)再算括號外,先乘除后加減
結(jié)合性:一個(gè)運(yùn)算數(shù)據(jù)兩側(cè)的運(yùn)算符優(yōu)先級相同時(shí),按運(yùn)算符結(jié)合性規(guī)定的結(jié)合方向處理,結(jié)合性分為兩種,左結(jié)合性(從左往右)和右結(jié)合性(從右往左)
數(shù)據(jù)類型的轉(zhuǎn)換規(guī)則:垂直降落,向上位移
垂直降落:如果運(yùn)算符是cher型的,則必須轉(zhuǎn)換為int型,是float的先轉(zhuǎn)換為double型
向上位移:如果時(shí)數(shù)據(jù)類型不相同,則先將低級別類型的轉(zhuǎn)換為高級別的
:int型的和double型運(yùn)算,則現(xiàn)將int型裝換為double型在運(yùn)算,結(jié)果為double型的
如果int型和float型運(yùn)算,則先降再移則是先將float轉(zhuǎn)換為double型,然后int 型轉(zhuǎn)換為double型進(jìn)行運(yùn)算

[強(qiáng)制類型轉(zhuǎn)換](https://baike.baidu.com/item/%E5%BC%BA%E5%88%B6%E7%B1%BB%E5%9E%8B%E8%BD%AC%E6%8D%A2)
強(qiáng)制類型轉(zhuǎn)換:是通過類型轉(zhuǎn)換運(yùn)算來實(shí)現(xiàn)的。其一般形式為:(類型說明符)(
[表達(dá)式](https://baike.baidu.com/item/%E8%A1%A8%E8%BE%BE%E5%BC%8F)
)其功能是把表達(dá)式的運(yùn)算結(jié)果
[強(qiáng)制轉(zhuǎn)換](https://baike.baidu.com/item/%E5%BC%BA%E5%88%B6%E8%BD%AC%E6%8D%A2)
成類型說明符所表示的類型
例如(float) a 把a(bǔ)轉(zhuǎn)換為浮點(diǎn)型,(int)(x+y) 把x+y的結(jié)果轉(zhuǎn)換為[整型](https://baike.baidu.com/item/%E6%95%B4%E5%9E%8B)
。
類型說明符和[表達(dá)式](https://baike.baidu.com/item/%E8%A1%A8%E8%BE%BE%E5%BC%8F)
都必須加括號(單個(gè)變量可以不加括號),如把(int)(x+y)寫成(int)x+y則成了把x轉(zhuǎn)換成int型之后再與y相加了。
無論是[強(qiáng)制轉(zhuǎn)換]
或是自動(dòng)轉(zhuǎn)換,都只是為了本次運(yùn)算的需要而對變量的數(shù)據(jù)長度進(jìn)行的臨時(shí)性轉(zhuǎn)換,而不改變數(shù)據(jù)說明時(shí)對該變量定義的類型。
main()
{
float f=5.75;
printf("f=%d,f=%f\n",(int)f,f);
}
結(jié)果:f=5,f=5.750000
將浮點(diǎn)數(shù)(單雙精度)轉(zhuǎn)換為整數(shù)時(shí),將舍棄浮點(diǎn)數(shù)的小數(shù)部分, 只保留整數(shù)部分。將整型值賦給浮點(diǎn)型變量,數(shù)值不變,只將形式改為浮點(diǎn)形式, 即小數(shù)點(diǎn)后帶若干個(gè)0。注意:賦值時(shí)的類型轉(zhuǎn)換實(shí)際上是強(qiáng)制的。
由于C語言中的浮點(diǎn)值總是用雙精度表示的,所以float 型數(shù)據(jù)只是在尾部加0延長為double型數(shù)據(jù)參加運(yùn)算,然后直接賦值。double型數(shù)據(jù)轉(zhuǎn)換為float型時(shí),通過截尾數(shù)來實(shí)現(xiàn),截?cái)嗲耙M(jìn)行四舍五入操作。
自加自減運(yùn)算符:自加運(yùn)算符++;自減運(yùn)算符--,自加自減運(yùn)算符都是單目運(yùn)算符,即運(yùn)算符要求有且只能有一個(gè)運(yùn)算量,例如:5++ ++5 4-- --4
++運(yùn)算符的功能是使變量的值自加1;--運(yùn)算符功能是使變量值自減1
自加自減運(yùn)算符的兩種形式:
前置:++i、--i,它的功能就是在使用i之前,i值先加(減)1(先執(zhí)行i+1或i-1,再使用i值)
后置:i++,--i,它的功能就是在使用i之后,i值再加(減)1(先執(zhí)行i值,再執(zhí)行i+1或i-1)
例如:j=3;k=++j; /賦值時(shí)j先加1,再將j的值賦給k,結(jié)果k=4,j=4;
j=3;k=j++; /賦值時(shí)j先賦給k,然后j再增1,結(jié)果k=3,j=4;
優(yōu)先級:高于算術(shù)運(yùn)算符,具有右結(jié)合性
正負(fù)號運(yùn)算符:+(正號)-(負(fù)號),和數(shù)學(xué)中一樣,運(yùn)算符優(yōu)先級大于算術(shù)運(yùn)算符,而與++ --同級,結(jié)合方向?yàn)樽杂邢蜃?
五、運(yùn)算符優(yōu)先級
http://blog.csdn.net/huangblog/article/details/8271791
注:上面網(wǎng)址里面有非常詳細(xì)的表格
六、邏輯運(yùn)算符
下面顯示了 C 語言支持的所有關(guān)系邏輯運(yùn)算符。假設(shè)變量 A 的值為 1,變量 B 的值為 0,則:
&& 稱為邏輯與運(yùn)算符。 如果兩個(gè)操作數(shù)都非零,則條件為真。 (A && B) 為假。
|| 稱為邏輯或運(yùn)算符。如果兩個(gè)操作數(shù)中有任意一個(gè)非零,則條件為真。 (A || B) 為真。
! 稱為邏輯非運(yùn)算符。 用來逆轉(zhuǎn)操作數(shù)的邏輯狀態(tài)。如果條件為真則邏輯非運(yùn)算符將使其為假。 !(A && B) 為真。
&& 左邊為0 結(jié)果=0 后面的不執(zhí)行 ;
|| 左邊為1 結(jié)果=1 后面的不執(zhí)行 ;
要注意的是&& ||都有不完全運(yùn)送。對于&&運(yùn)送則從左到右進(jìn)行判斷,如果左邊為0,說明此命題不可能再為真 ,則右邊不再計(jì)算,整個(gè)&&運(yùn)算就是0. ||運(yùn)算也是從左到右,如果有左邊為1,說明此命題不可能為假,則右邊也不在計(jì)算,直接輸出1.
七、三目運(yùn)算符與if語句
條件運(yùn)算符為?和:,它是一個(gè)三目運(yùn)算符,即有三個(gè)參與運(yùn)算的量。由條件運(yùn)算符組成條件表達(dá)式的一般形式為:
表達(dá)式1? 表達(dá)式2: 表達(dá)式3
其求值規(guī)則為:如果表達(dá)式1的值為真,則以表達(dá)式2 的值作為條件表達(dá)式的值,否則以表達(dá)式2的值作為整個(gè)條件表達(dá)式的值。 條件表達(dá)式通常用于賦值語句之中。
例如條件語句:
if(a>b) max=a;
else max=b;
可用條件表達(dá)式寫為 max=(a>b)?a:b; 執(zhí)行該語句的語義是:如a>b為真,則把a(bǔ)賦予max,否則把b 賦予max。
使用條件表達(dá)式時(shí),還應(yīng)注意以下幾點(diǎn):
1. 條件運(yùn)算符的運(yùn)算優(yōu)先級低于關(guān)系運(yùn)算符和算術(shù)運(yùn)算符,但高于賦值符。因此 max=(a>b)?a:b可以去掉括號而寫為 max=a>b?a:b
2. 條件運(yùn)算符?和:是一對運(yùn)算符,不能分開單獨(dú)使用。
3. 條件運(yùn)算符的結(jié)合方向是自右至左。
例如:
a>b?a:c>d?c:d應(yīng)理解為
a>b?a:(c>d?c:d) 這也就是條件表達(dá)式嵌套的情形,即其中的表達(dá)式3又是一個(gè)條
件表達(dá)式。
if 語句
用 if 語句可以構(gòu)成分支結(jié)構(gòu),它根據(jù)給的條件進(jìn)行判定,以決定執(zhí)行哪個(gè)分支程序段。
C 語言的 if 語句有三種基本形式
第一種形式:
if(條件表達(dá)式)
{
語句1;
}
if(條件表達(dá)式)
{
語句1;
}
這種形式運(yùn)行順序?yàn)椋寒?dāng)條件表達(dá)式為真,執(zhí)行語句1,否則,直接跳過語句1,執(zhí)行后面的語句
例子1:
BOOL result = YES;
if(result)
{
printf("result is true\n");
}
BOOL result = YES;
if(result)
{
printf("result is true\n");
}
輸出結(jié)果為:
result is true
如果把 result 的值改為 NO,那么就什么都不輸出了。
例子2:
int a = 5;
int b = 6;
if(a >= b)
{
printf("a大于b\n");
}
int a = 5;
int b = 6;
if(a >= b)
{
printf("a大于b\n");
}
輸出結(jié)果為:
什么都不輸出
如果改成這樣:
if(a <= b)
{
printf("a小于b\n");
}
if(a <= b)
{
printf("a小于b\n");
}
那么輸出結(jié)果為:a小于b。
第二種形式:
if(條件表達(dá)式)
{
語句1;
}
else
{
語句2;
}
if(條件表達(dá)式)
{
語句1;
}
else
{
語句2;
}
這種結(jié)構(gòu)的執(zhí)行順序?yàn)椋寒?dāng)條件表達(dá)式為真時(shí),執(zhí)行語句1,否則執(zhí)行語句2。
例子1:
BOOL result= YES;
if(result)
{
printf("result 為真\n");
}
else
{
printf("result 為假\n");
}
BOOL result= YES;
if(result)
{
printf("result 為真\n");
}
else
{
printf("result 為假\n");
}
這里的兩個(gè)輸出語句絕對不會(huì)同時(shí)輸出。
第三種形式:
if(條件表達(dá)式1)
{
語句1;
}
else if(條件表達(dá)式2)
{
語句2;
}
else
{
語句3;
}
if(條件表達(dá)式1)
{
語句1;
}
else if(條件表達(dá)式2)
{
語句2;
}
else
{
語句3;
}
這種結(jié)構(gòu)的執(zhí)行順序?yàn)椋寒?dāng)條件表達(dá)式1成立時(shí),執(zhí)行語句1,如果不成立則看條件表達(dá)式2是否成立,如果條件表達(dá)式2成立,則執(zhí)行語句2,如果條件表達(dá)式2也不成立這會(huì)執(zhí)行語句3。
例子1:
int age = 35;
if(age < 18)
{
printf("你是小孩子\n");
}
else if(age >= 60)
{
printf("你是位老人\n");
}
else
{
printf("你正當(dāng)青年啊, 小伙子!\n");
}
int age = 35;
if(age < 18)
{
printf("你是小孩子\n");
}
else if(age >= 60)
{
printf("你是位老人\n");
}
else
{
printf("你正當(dāng)青年啊, 小伙子!\n");
}
輸出結(jié)果為:
你正當(dāng)青年啊,小伙子!
八、switch語句
C語言還提供了另外一種多分支選擇的語句——switch 語句,它的基本語法格式如下:
switch(表達(dá)式){
case 常量表達(dá)式1: 語句 1;
case 常量表達(dá)式2: 語句 2;
......
case 常量表達(dá)式n: 語句 n;
default: 語句 n+1;
}
它的執(zhí)行過程是:首先計(jì)算“表達(dá)式”的值,然后從第一個(gè) case 開始,與“常量表達(dá)式x”進(jìn)行比較,如果與當(dāng)前常量表達(dá)式的值不相等,那么就不執(zhí)行冒號后邊的語句 x,一旦發(fā)現(xiàn)和某個(gè)常量表達(dá)式的值相等了,那么它會(huì)執(zhí)行之后所有的語句,如果直到最后一個(gè)“常量表達(dá)式 n”都沒有找到相等的值,那么就執(zhí)行 default 后的“語句 n+1”。
需要注意的是,當(dāng)找到一個(gè)相等的 case 分支后,會(huì)執(zhí)行該分支以及之后所有分支的語句。例如
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n");
case 2: printf("Tuesday\n");
case 3: printf("Wednesday\n");
case 4: printf("Thursday\n");
case 5: printf("Friday\n");
case 6: printf("Saturday\n");
case 7: printf("Sunday\n");
default:printf("error\n");
}
return 0;
}
運(yùn)行結(jié)果:
Input integer number:
Thursday
Friday
Saturday
Sunday
error
輸入4,發(fā)現(xiàn)和第四個(gè)分支匹配,于是就執(zhí)行第四個(gè)分支以及后面的所有分支。這顯然不是我們想要的結(jié)果,我們希望只執(zhí)行第四個(gè)分支,跳過后面的所有分支。
為了避免這種情況,C語言還提供了一個(gè)關(guān)鍵字 break,專門用于跳出switch語句。
switch 的分支語句一共有 n+1 種,而我們通常希望的都是選擇其中的一個(gè)分支來執(zhí)行,執(zhí)行完后就結(jié)束整個(gè) switch 語句,而繼續(xù)執(zhí)行 switch后面的語句,此時(shí)就可以通過在每個(gè)分支后加上 break 語句來實(shí)現(xiàn)了。如下:
switch (表達(dá)式){
case 常量表達(dá)式1: 語句1; break;
case 常量表達(dá)式2: 語句2; break;
......
case 常量表達(dá)式n: 語句n; break;
default: 語句n+1; break;
}
加了這個(gè) break 語句后,一旦“常量表達(dá)式 x”與“表達(dá)式”的值相等了,那么就執(zhí)行“語句 x”,執(zhí)行完畢后,由于有了 break 則直接跳出 switch 語句,繼續(xù)執(zhí)行 switch 語句后面的程序了,這樣就可以避免執(zhí)行不必要的語句。
使用switch語句修改上面的代碼:
#include <stdio.h>
int main(){
int a;
printf("Input integer number:");
scanf("%d",&a);
switch(a){
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
case 4: printf("Thursday\n"); break;
case 5: printf("Friday\n"); break;
case 6: printf("Saturday\n"); break;
case 7: printf("Sunday\n"); break;
default:printf("error\n"); break;
}
return 0;
}
運(yùn)行結(jié)果:
Input integer number:4
Thursday
值得一提的是,由于default是最后一個(gè)分支,匹配后不會(huì)再執(zhí)行其他分支,所以也可以不用break;語句。