以前我沒得選,現(xiàn)在我可以選擇了周叮,我選擇做個(gè)好人辩撑。——《無間道》
布爾類型
布爾類型本質(zhì)就是表示“是”或“不是”的變量仿耽。需要注意的是合冀,在C語言中,C89版本中沒有布爾值项贺,在C99版本中才出現(xiàn)了表示“是”或“否”的布爾值:bool君躺,也就是俗稱的“小布爾”峭判。在C99中,使用true表示“真”棕叫,使用false表示假林螃,整型數(shù)0表示假,非零表示真俺泣。
在OC中的布爾值是BOOL疗认,也就是俗稱的“大布爾”,使用YES表示真砌滞,使用NO表示假侮邀,用整型數(shù)0表示假,整型數(shù)1表示真贝润。
如何定義一個(gè)布爾變量呢绊茧?和定義一個(gè)正向變量一樣,使用類型修飾符+變量名+賦值就可以定義出一個(gè)布爾變量了
bool a = true;
BOOL b = YES;
如上代碼打掘,我們分別定義出了一個(gè)C中的布爾變量和一個(gè)OC中的布爾變量华畏,如果要打印他們的值可怎么辦?打印布爾變量的值和打印整型變量的值方式一樣尊蚁,使用%d
作為占位符亡笑,打印出0就表示“假”,打印出1就表示“真”横朋。
布爾值常常使用在分支語句中仑乌,根據(jù)不同的情況選擇執(zhí)行不同的分支代碼。
關(guān)系運(yùn)算符
負(fù)責(zé)比較兩個(gè)表達(dá)式琴锭、變量晰甚、常量的大小的運(yùn)算符就是關(guān)系運(yùn)算符,常用的有大于(>)决帖、小于(<)厕九、等于(==)、大于等于(>=)地回、小于等于(<=)扁远、不等于(!=)。
關(guān)系運(yùn)算符的運(yùn)算結(jié)果是布爾值刻像,需要用布爾類型的變量來保存結(jié)果畅买。如:
BOOL result = 12 > 23;
布爾變量result
保存的結(jié)果就是關(guān)系表達(dá)式12 > 13
的結(jié)果,很名顯绎速,這個(gè)表達(dá)式的結(jié)果為假皮获,打印result的值為0。
剛剛提到了“關(guān)系表達(dá)式”這個(gè)概念纹冤,什么是關(guān)系表達(dá)式洒宝?由常量购公、變量、關(guān)系運(yùn)算符組合而成的表達(dá)式雁歌,就是關(guān)系表達(dá)式宏浩。在關(guān)系運(yùn)算符的兩邊不僅可以放變量、常量靠瞎,還可以放表達(dá)式比庄,但是在這種情況下,注意運(yùn)算符的優(yōu)先級(jí)乏盐,先算哪個(gè)表達(dá)式佳窑,再算哪個(gè)表達(dá)式一定要搞清楚,否則程序很容易出錯(cuò)父能。
有幾個(gè)注意點(diǎn):
判斷是否相等的表達(dá)式為==神凑。
這一點(diǎn)和生活中有所不同,在生活中或數(shù)學(xué)領(lǐng)域何吝,使用“=”表示判斷相等溉委,在程序中使用一個(gè)短等號(hào)表示“賦值”的意思,將賦值號(hào)右邊的內(nèi)容賦給左邊爱榕;使用兩個(gè)短等號(hào)表示判斷是否相等的意思瓣喊,判斷等于表達(dá)式左右兩邊是否相等,相等返回真黔酥,不等返回假藻三。在程序中表示x大于a且小于b不能使用“a < x < b”,分開來寫跪者,兩個(gè)關(guān)系表達(dá)式之間使用“&&”連接趴酣。“&&”是個(gè)什么鬼坑夯?后邊的邏輯運(yùn)算符會(huì)講到。
邏輯運(yùn)算符
邏輯運(yùn)算符是用來判斷兩個(gè)表達(dá)式之間的邏輯關(guān)系的抡四,有與(&&)柜蜈、或(||)、非(V秆病)三種淑履。
邏輯表達(dá)式由常量、變量藻雪、邏輯運(yùn)算符組成秘噪。邏輯表達(dá)式的運(yùn)算結(jié)果和關(guān)系表達(dá)式的運(yùn)算結(jié)果一樣,都是只有兩種狀態(tài):真或假勉耀。使用布爾類型的變量保存指煎。
邏輯與:&&
邏輯與運(yùn)算的運(yùn)算規(guī)則:一假即假蹋偏。在邏輯與兩側(cè)的常量、變量至壤、表達(dá)式威始,只要有一個(gè)為假,整個(gè)邏輯表達(dá)式返回值為假像街。只有兩邊均為真黎棠,返回的值才為真。
邏輯與的短路現(xiàn)象:邏輯與運(yùn)算中镰绎,只要找到符合“假”的條件脓斩,馬上返回“假”,不再繼續(xù)向后計(jì)算畴栖。
int a = 10;
int b = 20;
BOOL r1 = (a < b) && (b == 3);
printf("%d\n", r1);
BOOL r2 = (a == 3) && (b > a);
printf("%d\n", r2);
BOOL r3 = (a > 3) && (b > a);
printf("%d\n", r3);
// 短路現(xiàn)象
BOOL r4 = (a > 5) && a++;
printf("r4 = %d, a = %d\n", r4, a);
// 表達(dá)式1結(jié)果為假随静,整個(gè)邏輯表達(dá)式結(jié)果已經(jīng)為假,表達(dá)式2不在進(jìn)行運(yùn)算
BOOL r5 = (b < 5) && b++;
printf("r5 = %d, b = %d\n", r5, b);
邏輯或 ||
邏輯或的運(yùn)算規(guī)則:一真即真驶臊。在邏輯或運(yùn)算符兩側(cè)的常量挪挤、變量、表達(dá)式关翎,只要有一個(gè)為真扛门,則整個(gè)邏輯表達(dá)式為真。
邏輯或的短路現(xiàn)象:邏輯或運(yùn)算中纵寝,只要找到符合“真”的條件论寨,馬上返回“真”,不管后邊是否還有表達(dá)式爽茴,均不再計(jì)算葬凳。
int a = 10;
int b = 20;
BOOL r1 = (a < b) || (b == 3);
printf("%d\n", r1);
BOOL r2 = (a == 3) || (b > a);
printf("%d\n", r2);
BOOL r3 = (a > 3) || (b > a);
printf("%d\n", r3);
// 短路現(xiàn)象
BOOL r4 = (a < 5) || a++;
printf("r4 = %d, a = %d\n", r4, a);
// 表達(dá)式1結(jié)果為真,整個(gè)邏輯表達(dá)式結(jié)果已經(jīng)為真室奏,表達(dá)式2不在進(jìn)行運(yùn)算
BOOL r5 = (b > 5) || b++;
printf("r5 = %d, b = %d\n", r5, b);
邏輯非 火焰!
邏輯非,即取反運(yùn)算胧沫。原來為真昌简,進(jìn)行邏輯非運(yùn)算后變?yōu)榧伲辉瓉頌榧偃拊梗M(jìn)行邏輯非運(yùn)算后變成真纯赎。對(duì)真假進(jìn)行取反操作。
BOOL a = YES;
BOOL b = !a;
printf("a = %d\n", a);
printf("b = %d\n", b);
運(yùn)算符的優(yōu)先級(jí)
掌握運(yùn)算符的優(yōu)先級(jí)可以準(zhǔn)確的寫出自己需要的語句南蹂。
運(yùn)算符的優(yōu)先級(jí): ! > 算數(shù)運(yùn)算符 > 關(guān)系運(yùn)算符 > 邏輯運(yùn)算符 > 賦值運(yùn)算符
分支控制語句
設(shè)計(jì)程序的結(jié)構(gòu)有三種形式:順序結(jié)構(gòu)犬金、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)。順序結(jié)構(gòu)的程序執(zhí)行就是從第一行代碼開始依次向后執(zhí)行到最后一行結(jié)束晚顷。分支結(jié)構(gòu)是判斷不同的情況峰伙,來執(zhí)行不同分支的代碼,也就是我們接下來要學(xué)習(xí)的一種結(jié)構(gòu)音同。循環(huán)結(jié)構(gòu)是在某種特定條件下词爬,重復(fù)的執(zhí)行某段代碼若干次。
if語句
if語句是C語言中提供分支結(jié)構(gòu)的一種語法权均,有三種寫法顿膨。分別可以實(shí)現(xiàn)單個(gè)分支,雙分支叽赊,多分支結(jié)構(gòu)恋沃。
單分支結(jié)構(gòu)
if (條件表達(dá)式) {
語句
}
if 如果
條件表達(dá)式:里邊可以寫算術(shù)表達(dá)式、邏輯表達(dá)式...... 表達(dá)式的結(jié)果為真或假必指。 如果條件表達(dá)式為真囊咏,執(zhí)行{}內(nèi)的語句;如果條件表達(dá)式為假塔橡,跳過{}梅割,執(zhí)行下面的語句
編碼規(guī)范 注意空格和換行
示例代碼:
int a = 4, b = 5;
if (a < b) {
printf("條件表達(dá)式結(jié)果為真\n");
}
printf("我在if語句下面\n");
雙分支結(jié)構(gòu)
if ( 條件表達(dá)式 ) {
語句1
} else {
語句2
}
雙分支結(jié)構(gòu)一般用于“某條件成立則執(zhí)行分之一,否則執(zhí)行分支二”的情況葛家。
多分支結(jié)構(gòu)
if ( 條件表達(dá)式1 ) {
語句1
} else if ( 條件表達(dá)式2 ) {
語句2
} else {
語句3
}
像這種多分支結(jié)構(gòu)户辞,需要判斷多個(gè)不同的情況來決定執(zhí)行哪一個(gè)分支。
條件運(yùn)算符
條件運(yùn)算符是if語句中雙分支結(jié)構(gòu)的一種變形癞谒,可以用來處理一些簡(jiǎn)單的分支判斷底燎。語法如下
條件表達(dá)式 ? 表達(dá)式1 : 表達(dá)式2
運(yùn)算規(guī)則:如果條件表達(dá)式為真,整個(gè)表達(dá)式的值為表達(dá)式1的值弹砚;如果條件表達(dá)式為假双仍,整個(gè)表達(dá)式的值為表達(dá)式2的值。
示例代碼:
int a = 3, b = 4;
int c = a > b ? a : b;
示例中的條件表達(dá)式為假桌吃,所以整個(gè)表達(dá)式返回的值是表達(dá)式二的值朱沃,也就是b的值,打印整形變量c的值茅诱,就是4为流。
拓展:如果表達(dá)式一的位置什么都不寫,如a>b ? : 23
让簿,當(dāng)a>b
為真,那么整個(gè)表達(dá)式返回的值是'a>b'的值秀睛,如果a>b
為假尔当,則整個(gè)表達(dá)式返回的值是表達(dá)式二的值,也就是23
。這是一種簡(jiǎn)略的寫法椭迎,在OC中經(jīng)常使用锐帜。
switch語句
在多分支結(jié)構(gòu)中,除了if語句畜号,還有一種更合適的語法:switch語句缴阎。使用switch...case...結(jié)構(gòu)代替if的級(jí)聯(lián)結(jié)構(gòu),大大的提高了代碼的可讀性简软,簡(jiǎn)化了代碼量蛮拔。
switch的語法
switch (整型或字符型表達(dá)式) {
case 整型或字符型常量:
語句一;
break;
case 整型或字符型常量:
語句二;
break;
default:
默認(rèn)情況下執(zhí)行的語句;
break;
}
多分支語句
作用:提供多個(gè)分支,功能類似if-else級(jí)聯(lián)式痹升,代碼可讀性更好
語法:
(1)switch后面是 整型或字符型表達(dá)式
(2)case后面是 整型或字符型常量
(3)case后面需要添加{}
(4)break建炫。case和default默認(rèn)都跟隨一個(gè)break語句,用于結(jié)束某個(gè)case疼蛾,然后結(jié)束switch控制語句肛跌,執(zhí)行switch后面的語句。
運(yùn)行邏輯:
(1)如果表達(dá)式和某個(gè)case常量相等察郁,執(zhí)行這個(gè)case后面的語句衍慎。
(2)如果沒有和表達(dá)式相等的case常量,執(zhí)行default后面的語句皮钠。
坑點(diǎn):在每一個(gè)case分支最后稳捆,需要使用一個(gè)break
跳出switch語句,否則鳞芙,程序會(huì)執(zhí)行后邊的case語句眷柔,直到遇到一個(gè)break
或者執(zhí)行完整個(gè)case才能跳出switch語句,繼續(xù)向后執(zhí)行原朝。
枚舉
關(guān)于枚舉驯嘱,你需要知道的:
- 枚舉屬于構(gòu)造類型
- 一組 具有名稱的 整型常量。
- 目的:提高代碼可讀性喳坠。 標(biāo)示符:人類可以識(shí)別 數(shù)字:計(jì)算機(jī)可以識(shí)別
- 語法:
enum 枚舉變量名 {
標(biāo)識(shí)符1, // 默認(rèn)從0開始鞠评,也可以自定義。標(biāo)識(shí)符對(duì)應(yīng)的數(shù)值遞增壕鹉,增量為1
標(biāo)識(shí)符2,
...
};
- 定義枚舉類型寫在函數(shù)外面
- 枚舉類型變量每次只能賦一個(gè)數(shù)值剃幌,但是數(shù)值包含多種
示例代碼
在main函數(shù)外定義一個(gè)枚舉
enum ColorType {
red,
yellow,
green = 10,
blue
};
使用定義好的枚舉:
printf("%d %d %d %d\n", red, yellow, green, blue);
enum ColorType color1 = red;
enum ColorType color2 = yellow;
enum ColorType color3 = green;
enum ColorType color4 = blue;
printf("color1 = %d\n", color1);
printf("color2 = %d\n", color2);
printf("color3 = %d\n", color3);
printf("color4 = %d\n", color4);