C 語言入門 / C 控制結構
C 語言包含許多迴圈結構,例如 "while" 迴圈
/* while.c */
#include <stdio.h>
void main()
{
int test = 10;
while( test > 0 )
{
printf( "test = %d\n", test );
test = test - 2;
}
}
如果 "test" 的初始值小於或等於 0,則 "while" 迴圈將不會執行,即使只有一次。 還有一個變體 "do",它總是至少執行一次
/* do.c */
#include <stdio.h>
void main()
{
int test = 10;
do
{
printf( "test = %d\n", test );
test = test - 2;
}
while( test > 0 );
}
最常見的迴圈結構是 "for" 迴圈,它建立了一個類似於 "while" 迴圈但更緊湊的迴圈
/* for.c */
#include <stdio.h>
void main()
{
int test;
for( test = 10; test > 0; test = test - 2 )
{
printf( "test = %d\n", test );
}
}
請注意,對於所有這些迴圈,初始迴圈語句 *不* 以 ";" 結尾。 如果在上面的 "for" 語句末尾放置一個 ";",則 "for" 語句將執行完畢,但不會執行迴圈體中的任何語句。
"for" 迴圈的語法為
for( <initialization>; <operating test>; <modifying expression> )
括號中的所有元素都是可選的。 "for" 迴圈可以使用以下程式碼無限次執行
for( ; ; )
{
...
}
—雖然使用無限 "while" 迴圈更簡潔
while( 1 )
{
...
}
可以使用 "," 運算子在初始化表示式或修改表示式中使用多個表示式
/* formax.c */
#include <stdio.h>
void main()
{
int a, b;
for ( a = 256, b = 1; b < 512 ; a = a / 2, b = b * 2 )
{
printf( "a = %d b = %d\n", a, b );
}
}
C 語言可用的條件測試如下
a == b equals
a != b not equals
a < b less than
a > b greater than
a <= b less than or equals
a >= b greater than or equals
使用 "==" 執行 "等於" 測試,而使用 "=" 作為賦值運算子這一事實經常會導致混淆,這也是 C 語言程式設計中常見的錯誤
a == b Is "a" equal to "b"?
a = b Assign value of "b" to "a".
C 語言還包含決策語句,例如 "if"
/* if.c */
#include <stdio.h>
#define MISSILE 1
void fire( int weapon );
void main()
{
fire( MISSILE );
}
void fire( int weapon )
{
if( weapon == MISSILE )
{
printf( "Fired missile!\n" );
}
if( weapon != MISSILE )
{
printf( "Unknown weapon!\n");
}
}
這個例子可以使用 "else" 子句更輕鬆地實現
/* ifelse.c */
void fire( int weapon )
{
if( weapon == MISSILE )
{
printf( "Fired missile!\n" );
}
else
{
printf( "Unknown weapon!\n");
}
}
由於每個子句中只有一個語句,因此花括號實際上並不必要。 這個例子也能正常工作
void fire( int weapon )
{
if( weapon == MISSILE )
printf( "Fired missile!\n" );
else
printf( "Unknown weapon!\n" );
}
但是,花括號使結構更清晰,並可以防止在條件子句中新增語句時出現錯誤。 編譯器並不關心哪種方式,它會生成相同的程式碼。
沒有 "elseif" 關鍵字,但可以巢狀 "if" 語句
/* nestif.c */
#include <stdio.h>
#define MISSILE 1
#define LASER 2
void fire( int weapon );
void main()
{
fire( LASER );
}
void fire( int weapon )
{
if( weapon == MISSILE )
{
printf( "Fired missile!\n" );
}
else
{
if( weapon == LASER )
{
printf( "Fired laser!\n" );
}
else
{
printf( "Unknown weapon!\n");
}
}
}
這有點笨拙。 "switch" 語句執行得更乾淨
/* switch.c */
void fire( int weapon )
{
switch( weapon )
{
case MISSILE:
printf( "Fired missile!\n" );
break;
case LASER:
printf( "Fired laser!\n" );
break;
default:
printf( "Unknown weapon!\n");
break;
}
}
"switch" 語句測試單個變數的值;與 "if" 語句不同,它不能測試多個變數。 可選的 "default" 子句用於處理其他 case 未覆蓋的條件。
每個子句都以一個 "break" 結尾,它會導致執行退出 "switch"。 遺漏 "break" 可能是 C 程式中另一個細微的錯誤,因為如果沒有它,執行將直接流入下一個子句。 然而,這可以被利用。 假設在我們的示例中,該例程也可以被要求發射一枚 ROCKET,它與 MISSILE 相同
void fire( int weapon )
{
switch( weapon )
{
case ROCKET:
case MISSILE:
printf( "Fired missile!\n" );
break;
case LASER:
printf( "Fired laser!\n" );
break;
default:
printf( "Unknown weapon!\n");
break;
}
}
"break" 語句不特定於 "switch" 語句。 它可以用於退出其他控制結構,儘管良好的程式設計往往避免這種即興發揮
/* break.c */
#include <stdio.h>
void main()
{
int n;
for( n = 0; n < 10; n = n + 1 )
{
if( n == 5 )
{
break; /* Punch out of loop at value 5. */
}
else
{
printf( "%d\n", n );
}
}
}
如果 "for" 迴圈巢狀在 "while" 迴圈中,"break" 退出
"for" 迴圈仍會讓你陷入 "while" 迴圈中。 "break" 關鍵字只適用於執行它的控制結構。
還有一個 "continue" 語句,它跳到迴圈體末尾,並繼續執行迴圈的下一個迭代。 例如
/* continue.c */
#include <stdio.h>
void main()
{
int n;
for( n = 0; n < 10; n = n + 1 )
{
if( n == 5 )
{
continue;
}
else
{
printf( "%d\n", n );
}
}
}
最後,還有一個 "goto" 語句
goto punchout;
...
punchout:
—跳到函式內的任意標記,但這
語句通常不建議使用,在實踐中很少見。
雖然這些是 C 語言的全部真實控制結構,但還有一個特殊的 "條件運算子",它執行形式為以下簡單的條件賦值
if( a == 5)
{
b = -10;
}
else
{
b = 255;
}
—使用更簡潔但更神秘的格式
b = ( a == 5 ) ? -10 : 255 ;
the ?: 結構稱為三元運算子 - 或三元運算子 - 因為它接受 3 個引數。