# 練習12:If,Else If,Else
> 原文:[Exercise 12: If, Else-If, Else](http://c.learncodethehardway.org/book/ex12.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
`if`語句是每個編程語言中共有的特性,包括C語言。下面是一段代碼,使用了`if`語句來確保只傳入了一個或兩個命令行參數:
```c
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
if(argc == 1) {
printf("You only have one argument. You suck.\n");
} else if(argc > 1 && argc < 4) {
printf("Here's your arguments:\n");
for(i = 0; i < argc; i++) {
printf("%s ", argv[i]);
}
printf("\n");
} else {
printf("You have too many arguments. You suck.\n");
}
return 0;
}
```
`if`語句的格式為:
```c
if(TEST) {
CODE;
} else if(TEST) {
CODE;
} else {
CODE;
}
```
下面是其它語言和C的差異:
+ 像之前提到的那樣,`TEST`表達式值為0時為`false`,其它情況為`true`。
+ 你需要在`TEST`周圍寫上圓括號,其它語言可能不用。
+ (只有單條語句時)你并不需要使用花括號`{}`來閉合代碼,但是這是一種非常不好的格式,不要這么寫。花括號讓一個分支的代碼的開始和結束變得清晰。如果你不把代碼寫在里面會出現錯誤。
除了上面那些,就和其它語言一樣了。`else if`或者`else`的部分并不必須出現。
## 你會看到什么
這段代碼非常易于運行和嘗試:
```sh
$ make ex12
cc -Wall -g ex12.c -o ex12
$ ./ex12
You only have one argument. You suck.
$ ./ex12 one
Here's your arguments:
./ex12 one
$ ./ex12 one two
Here's your arguments:
./ex12 one two
$ ./ex12 one two three
You have too many arguments. You suck.
$
```
## 如何使它崩潰
使這段代碼崩潰并不容易,因為它太簡單了。嘗試把`if`語句的測試表達式搞亂:
+ 移除`else`部分,使它不能處理邊界情況。
+ 將`&&`改為`||`,于是你會把“與”操作變成“或”操作,并且看看會發生什么。
## 附加題
+ 我已經向你簡短地介紹了`&&`,它執行“與”操作。上網搜索與之不同的“布爾運算符”。
+ 為這個程序編寫更多的測試用例,看看你會寫出什么。
+ 回到練習10和11,使用`if`語句使循環提前退出。你需要`break`語句來實現它,搜索它的有關資料。
+ 第一個判斷所輸出的話真的正確嗎?由于你的“第一個參數”不是用戶輸入的第一個參數,把它改正。
- 笨辦法學C 中文版
- 前言
- 導言:C的笛卡爾之夢
- 練習0:準備
- 練習1:啟用編譯器
- 練習2:用Make來代替Python
- 練習3:格式化輸出
- 練習4:Valgrind 介紹
- 練習5:一個C程序的結構
- 練習6:變量類型
- 練習7:更多變量和一些算術
- 練習8:大小和數組
- 練習9:數組和字符串
- 練習10:字符串數組和循環
- 練習11:While循環和布爾表達式
- 練習12:If,Else If,Else
- 練習13:Switch語句
- 練習14:編寫并使用函數
- 練習15:指針,可怕的指針
- 練習16:結構體和指向它們的指針
- 練習17:堆和棧的內存分配
- 練習18:函數指針
- 練習19:一個簡單的對象系統
- 練習20:Zed的強大的調試宏
- 練習21:高級數據類型和控制結構
- 練習22:棧、作用域和全局
- 練習23:認識達夫設備
- 練習24:輸入輸出和文件
- 練習25:變參函數
- 練習26:編寫第一個真正的程序
- 練習27:創造性和防御性編程
- 練習28:Makefile 進階
- 練習29:庫和鏈接
- 練習30:自動化測試
- 練習31:代碼調試
- 練習32:雙向鏈表
- 練習33:鏈表算法
- 練習34:動態數組
- 練習35:排序和搜索
- 練習36:更安全的字符串
- 練習37:哈希表
- 練習38:哈希算法
- 練習39:字符串算法
- 練習40:二叉搜索樹
- 練習41:將 Cachegrind 和 Callgrind 用于性能調優
- 練習42:棧和隊列
- 練習43:一個簡單的統計引擎
- 練習44:環形緩沖區
- 練習45:一個簡單的TCP/IP客戶端
- 練習46:三叉搜索樹
- 練習47:一個快速的URL路由
- 后記:“解構 K&R C” 已死