程式可以如此靈活的原因之一,就是能依據不同的條件,來進行不同的工作。 要進行判斷,可以使用if...else的語法,如下:

if(條件運算式){
	程式敘述1; /* 當然也可以是很多筆敘述 */
}
else {
	程式敘述2;
}
當條件成立時,將執行敘述1,否則會執行敘述2。如果不需要敘述2,則可省略else以下的部分。 另,程式敘述只有一條時,可以省略大括號,但為了避免解讀上的誤會,有時不會這麼做。

以成績及格與否的判斷做為一個簡單的範例, 其邏輯上為「60分以上及格,否則被當」。寫成程式碼時的範例如下:

#include<stdio.h>

int main()
{
	int grade;
	scanf("%d", &grade); /* 接受使用者輸入一個整數 */
	if(grade>=60){
		printf("及格\n");
	}
	else {
		printf("GG\n");
	}
	return 0;
}

上例中的「>=」,稱之為條件運算子,可以用來判斷左邊的運算結果,是否大於等於右邊的運算結果。 其餘的條件運算子有:

使用範例如下:

#include<stdio.h>

int main()
{
	int a, b;

	a = 10;
	if( a > 5 ){
		printf("a比5大\n");
	}

	b = 7;
	if( b % 2 != 0 ){
		printf("b是奇數\n");
	}

	a = 2;
	b = 3;
	if( a > 0 && b > 0 ){
		printf("a和b都是正數\n");
	}

	a = 20;
	b = 90;
	if( a > 60 || b > 70 ){
		printf("a或b至少有一個及格\n");
	}

	return 0;
}

或和且的混用:

#include<stdio.h>

int main()
{
	int a, b, c;

	a = 10;
	b = 20;
	c = 30;
	/**
	下列條件符合其一時執行
	1. a 比 5 大,而且 b 比 10 大
	2. c 比 15 大
	**/
	if( a > 5 && b > 10 || c > 15){
		printf("測試一:條件符合\n");
	}

	a = 15;
	b = 20;
	c = 3;
	/**
	下列條件都要符合時執行
	1. a 比 5 大,或者 b 比 10 大
	2. c 比 15 大
	**/
	if( (a > 5 || b > 10) && c > 15){
		printf("測試二:條件符合\n");
	}
	else {
		printf("測試二:條件不符\n");
	}

	return 0;
}

如果要進行的條件判斷和動作比較簡單,可以使用「?:」來進行之:

#include<stdio.h>

int main()
{
	int grade = 70;
	int a=1, b=2, c;
	
	// 例如第一個範例,可以簡化成這樣
	(grade>=60)?printf("及格\n"):printf("GG\n");

	// 也可以這樣用
	c = (a>b)?(a+b):(a-b);
	printf("Value of c: %d\n", c);

	return 0;
}

以下提到的,則是一些容易有問題,甚至是錯誤的用法。

"或"就像加法,"且"就像乘法,它們也遵守先乘除後加減的規則。我們把前面某個範例的括號拿掉看看:

#include<stdio.h>

int main()
{
	int a, b, c;

	a = 15;
	b = 20;
	c = 3;
	/**
	下列條件都要符合時執行
	1. a 比 5 大,或者 b 比 10 大
	2. c 比 15 大
	**/
	if( a > 5 || b > 10 && c > 15){
		printf("測試二:條件符合\n");
	}
	else {
		printf("測試二:條件不符\n");
	}

	return 0;
}

在數學式子中,我們會寫"a < b < c",這是大家很熟悉的遞移律。 但若要在程式中進行這樣的判斷,可能必須分開寫:

#include<stdio.h>

int main()
{
	int a=3, b=2, c=1;
	
	if(a > b > c){
		printf("條件符合\n");
	}
	else {
		printf("Ha ha ha UCCU\n");
	}

	return 0;
}
原因是這些比較運算,是由左到右進行的。在範例中,「3 > 2」會先被計算,而產生「TRUE」的結果。 此結果在電腦中以數字 1 代表,而後進行「1 > 1」的計算時,就會被視為條件不符。

再次注意,判斷是否相等是用兩個等號, 一個等號的「=」是指派運算,代表把值塞給變數,和判斷相等的「==」很容易造成誤會:

#include<stdio.h>

int main()
{
	int a=123, b=456;

	if(a=1){/* 錯誤用法 */
		printf("a的值為%d\n", a);
	}

	if(a=0){/* 錯誤用法 */
		printf("a的值為%d\n", a);
	}

	if(b=0){/* 錯誤用法 */
		printf("b的值為%d\n", b);
	}

	if(b==0){/* 正確用法 */
		printf("b的值為%d\n", b);
	}

	return 0;
}
以上是由於 C 語言的條件判斷,是跟據運算結果是否為 0 來決定是否符合,0 為不符合,非 0 為符合。 所以,「if(a=1)」會先將 a 的值指定為 1 ,然後讓 if 收到 1 ,所以會執行裡面的程式敘述。 為了避免不小心犯錯,所以在與常數比較時,可以寫成「1==a」的形式,如下:
#include<stdio.h>

int main()
{
	int a=123;

	if(123==a){
		printf("a的值為%d\n", a);
	}

	if(a==123){ /* 當然還是可以這樣寫 */
		printf("a的值為%d\n", a);
	}

	if(a=456){ /* 錯誤用法 */
		printf("a的值為%d\n", b);
	}

	if(456=a){ /* 這裡會導致編譯錯誤 */
		printf("a的值為%d\n", b);
	}

	return 0;
}



進行程式設計時,可以依照自己的流程需求,使用合適的條件判斷方式。 而如果所需要的條件判斷較為複雜時,則可使用巢狀(一層包一層)的敘述, 例如閏年的判斷, 其規則為逢4的倍數閏、100的倍數不閏、400的倍數閏,程式碼可以寫成以下的樣子(加入完整的縮排與括號):

#include<stdio.h>

int main()
{
	int year;
	scanf("%d", &year);
	if(year%400==0){
		printf("閏年\n");
	}
	else {
		if(year%100==0){
			printf("平年\n");
		}
		else {
			if(year%4==0){
				printf("閏年\n");
			}
			else {
				printf("平年\n");
			}
		}
	}

	return 0;
}
也可搭配括號省略的原則,寫成下面這樣:
#include<stdio.h>

int main()
{
	int year;
	scanf("%d", &year);
	if(year%400==0){
		printf("閏年\n");
	}
	else if(year%100==0){
		printf("平年\n");
	}
	else if(year%4==0){
		printf("閏年\n");
	}
	else {
		printf("平年\n");
	}

	return 0;
}

另外一種進行條件判斷的語法,是switch...case,其語法如下:

switch(變數或運算式){
	case 變數值或運算結果1:
		程式敘述1;
		break;
	case 變數值或運算結果2:
		程式敘述2;
		break;
	/* ...... */
	case 變數值或運算結果n-1:
		程式敘述n-1;
		break;
	default:
		程式敘述n;
}

當程式進入此片段時,會對變數或運算結果對每一個 case 進行判斷, 如果找到符合的 case,則會執行該 case 內的敘述。 加入「break;」的目的是離開 switch 判斷,否則連以下其它 case 的程式敘述也會被執行。 若沒有任何一個 case 符合,才會執行 defalut 內的敘述;default 是可有可無的。 包含 default 在內的所有 case,都不需要用大括號包住所屬的程式敘述。

以下範例會根據月份判斷天數。此處尚未跟閏年判斷結合,所以當使用者輸入二月時,會印出兩種結果。

#include<stdio.h>

int main()
{
	int month;
	scanf("%d", &month);
	switch(month){
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			printf("有31天\n");
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			printf("有30天\n");
			break;
		case 2:
			printf("有28或29天\n");
			break;
		default:
			 printf("查無此月份!\n");
	}
	return 0;
}