?? 第1章 c語言.txt
字號:
C語言編程中的常見問題
發表日期:2003年9月21日 作者:C語言之家 整理 已經有15277位讀者讀過此文
第1章 C語言
本章主要描述C語言一些基本要素。當你開始編寫C程序時,你可能對C語言的一些基本問題感到困惑,如C語言所使用的約定、關鍵字和術語等。本章將回答這方面你經常會遇到的一些問題。
例如,switch語句是最常用的一種C語言構件,本章將回答與它有關的三個常見問題。本章還涉及其它幾個問題,如循環、分支、運算符的優先級和程序塊技術。在閱讀本章時,請注意有關switch語句和運算符優先級的一些問題,這些問題常常會使C語言的初學者感到迷惑。
1.1 什么是局部程序塊(local block)?
局部程序塊是指一對大括號({})之間的一段C語言程序。一個C函數包含一對大括號,這對大括號之間的所有內容都包含在一個局部程序塊中。if語句和swich語句也可以包含一對大括號,每對大括號之間的代碼也屬于一個局部程序塊。此外,你完全可以創建你自己的局部程序塊,而不使用C函數或基本的C語句。你可以在局部程序塊中說明一些變量,這種變量被稱為局部變量,它們只能在局部程序塊的開始部分說明,并且只在說明它的局部程序塊中有效。如果局部變量與局部程序塊以外的變量重名,則前者優先于后者。下面是一個使用局部程序塊的例子:
#include <stdio.h>
void main(void);
void main()
{
/ * Begin local block for function main() * /
iht test_ var = 10;
printf("Test variable before the if statement: %d\n", test_var);
if (test_var>5)
{
/ * Begin local block for "if" statement * /
int test_ var = 5;
printf("Test variable within the if statement: %d\n",
test_var);
{
/ * Begin independent local block (not tied to
any function or keyword) * /
int test_var = 0;
printf (
"Test variable within the independent local block: %d\n",
test_var)
}
/ * End independent local block * /
printf ("Test variable after the if statement: %d\n", test_var);
}
/*End local block for function main () * /
上例產生如下輸出結果:
Test variable before the if statement: 10
Test variable within the if statement: 5
Test variable within the independent local block:0
Test variable after the if statement: 10
注意,在這個例子中,每次test_var被定義時,它都要優先于前面所定義的test_var變量。此外還要注意,當if語句的局部程序塊結束時,程序重新進入最初定義的test_var變量的作用范圍,此時test_var的值為10。
請參見:
1.2可以把變量保存在局部程序塊中嗎?
1.2 可以把變量保存在局部程序塊中嗎?
用局部程序塊來保存變量是不常見的,你應該盡量避免這樣做,但也有極少數的例外。例如,為了調試程序,你可能要說明一個全局變量的局部實例,以便在相應的函數體內部進行測試。為了使程序的某一部分變得更易讀,你也可能要使用局部程序塊,例如,在接近變量被使用的地方說明一個變量有時就會使程序變得更易讀。然而,編寫得較好的程序通常不采用這種方式來說明變量,你應該盡量避免使用局部程序塊來保存變量。
請參見:
1.1 什么是局部程序塊?
1.3 什么時候用一條switch語句比用多條if語句更好?
如果你有兩個以上基于同一個數字(numeric)型變量的條件表達式,那么最好使用一條switch語句。例如,與其使用下述代碼:
if (x ==l)
printf ("x is equal to one. \n");
else if (x ==2)
printf ("x is equal to two. \n");
else if (x = =3)
printf ("x is equal to three. \n");
else
printf ("x is not equal to one, two, or three. \n");
不如使用下述代碼,它更易于閱讀和維護:
switch (x)
{
case 1: printf ("x is equal to one. \n");
break;
case 2: printf ("x is equal to two. \n");
break
case 3: printf ('x is equal to three. \n");
break;
default: printf ("x is not equal to one, two, or three. \n");
break;
}
注意,使用switch語句的前提是條件表達式必須基于同一個數字型變量。例如,盡管下述if語句包含兩個以上的條件,但該例不能使用switch語句,因為該例基于字符串比較,而不是數字比較:
char *name="Lupto";
if(!stricmp(name,"Isaac"))
printf("Your name means'Laughter'.\n");
else if(!stricmp(name,"Amy"))
printf("Your name means'Beloved'.\n");
else if(!stricmp(name,"Lloyd"))
printf("Your name means'Mysterious'.\n");
else
printf("I haven't a clue as to what your name means.\n");
請參見:
1.4 switch語句必須包含default分支嗎7
1.5 switch語句的最后一個分支可以不要break語句嗎?
1. 4 switch語句必須包含default分支嗎?
不,但是為了進行錯誤檢查或邏輯檢查,還是應該在switch語句中加入default分支。例如,下述switch語句完全合法:
switch (char_code)
{
case tyt:
case 'y': printf ( " You answered YES ! \n" )
break
case 'N':
case 'n': printf ("You answered NO!\n");
break
}
但是,如果一個未知字符被傳遞給這條switch語句,會出現什么情況呢?這時,程序將沒有任何輸出。因此,最好還是加入一個default分支,以處理這種情況:
......
default: printf ("Unknown response : %d\n", char_code);
break
......
此外,default分支能給邏輯檢查帶來很多方便。例如,如果用switch語句來處理數目固定的條件,而且認為這些條件之外的值都屬于邏輯錯誤,那么可以加入一個default分支來辨識邏輯錯誤。請看下列:
void move_cursor (int direction)
{
switch (direction)
{
case UP: cursor_up()
break
case DOWN: cursor_down()
break
case LEFT: cursor_left ()
break
case RIGHT: cursor_ right ( )
break
default: printf ("Logic error on line number %ld!!! \n",
__ LINE__ )
break
}
}
請參見:
1.3 什么時候用一條switch語句比用多條if語句更好?
1.5 Switch語句的最后一個分支可以不要break語句嗎?
1.5 switch語句的最后一個分支可以不要break語句嗎?
盡管switch語句的最后一個分支不一定需要break語句,但最好還是在switch語句的每個分支后面加上break語句,包括最后一個分支。這樣做的主要原因是:你的程序很可能要讓另一個人來維護,他可能要增加一些新的分支,但沒有注意到最后一個分支沒有break語句,結果使原來的最后一個分支受到其后新增分支的干擾而失效。在每個分支后面加上break語句將防止發生這種錯誤并增強程序的安全性。此外,目前大多數優化編譯程序都會忽略最后一條break語句,所以加入這條語句不會影響程序的性能。
請參見:
1. 3 什么時候用一條switch語句比用多條if語句更好?
1. 4 switch語句必須包含default分支嗎?
1. 6 除了在for語句中之外,在哪些情況下還要使用逗號運算符?
逗號運算符通常用來分隔變量說明、函數參數、表達式以及for語句中的元素。下例給出了使用逗號的多種方式:
#include <stdio.h>
#include <stdlib.h>
void main(void);
void main ()
{
/ * Here, the comma operator is used to separate
three variable declarations. * /
int i, j, k;
/ * Notice how you can use the comma operator to perform
multiple initializations on the same line. * /
i=0, j=1, k=2;
printf("i= %d, j=%d, k= %d\n", i, j, k);
/ * Here, the comma operator is used to execute three expressions
in one line: assign k to i, increment j, and increment k.
The value that i receives is always the rigbtmost expression. * /
i= ( j++, k++ );
printf("i=%d, j=%d, k=%d\n", i, j, k);
/ * Here, the while statement uses the comma operator to
assign the value of i as well as test it. * /
while (i=(rand() % 100), i !=50)
printf("i is %d, trying again... \n", i)
printf ("\nGuess what? i is 50!\n" )
}
請注意下述語句:
i:(j++,k++)
這條語句一次完成了三個動作,依次為:
(1)把k值賦給i。這是因為左值(lvaule)總是等于最右邊的參數,本例的左值等于k。注意,本例的左值不等于k++,因為k++是一個后綴自增表達式,在把k值賦給j之后k才會自增。如果所用的表達式是++k,則++k的值會被賦給i,因為++k是一個前綴自增表達式,k的自增發生在賦值操作之前。
(2)j自增。
(3)k自增。
此外,還要注意看上去有點奇怪的while語句:
while (i=(rand() % 100), i !=50)
printf("i is %d, trying again... \n");
這里,逗號運算符將兩個表達式隔開,while語句的每次循環都將計算這兩個表達式的值。逗號左邊是第一個表達式,它把0至99之間的一個隨機數賦給i;第二個表達式在while語句中更常見,它是一個條件表達式,用來判斷i是否不等于50。while語句每一次循環都要賦予i一個新的隨機數,并且檢查其值是否不等于50。最后,i將被隨機地賦值為50,而while語句也將結束循環。
請參見:
1.12 運算符的優先級總能保證是“自左至右”或“自右至左”的順序嗎?
1.13 ++var和var++有什么區別?
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -