int main( void )
{
int a = 5;
printf( "%d", A );
return 0;
}
編譯器認為 a 和 A 是兩個不同的變量名,而顯示出錯信息。C 語言規定大寫字母和小寫字母是不同的字符;而有些編程語言是不分大小寫的。習慣上,符號常量名用大寫,變量名用小寫表示,以增加可讀性。
2. 忽略了變量的類型,進行了不合法的運算。
int main( void )
{
float a, b;
printf( "%d", a % b );
return 0;
}
% 是求余運算符,a % b 的結果是 a 除以 b 的余數。只有 % 左右兩邊的操作數都是整型時,才可以進行求余運算。故而上面的程序是錯誤的,因為 a 和 b 是浮點型變量。
3. 將字符常量與字符串常量混淆。
char c;
c = "a";
這裏就混淆了字符常量與字符串常量,字符常量是由壹對單引號括起來的單個字符,字符串常量是壹對雙引號括起來的字符序列。C 語言規定以 \0
作字符串常量的結束標誌,它是由系統自動加上的,所以 "a" 實際上包含兩個字符:'a' 和 '\0'。所以把 "a" 賦給字符變量是不行的。
4. 忽略了“=”與“==”的區別。
許多高級語言都使用“=”符號作為關系運算符的“等於”。如 BASIC 程序中可以寫:
if ( a = 3 ) then …
但 C 語言中,“=”是賦值運算符,“==”才是關系運算符。如:
if (a == 3)
a = b;
a == 3 是比較 a 是否等於 3;而 a = b; 表示把 b 的值賦給 a。初學者往往會把 a == 3 錯寫成 a = 3,這樣寫是符合語法的,但是不符合我們的期望。如果錯寫成了 a = 3,有些編譯器會給出警告。
5. 忘記加分號。
分號是 C 語句中不可缺少的壹部分,語句末尾必須有分號。
a = 1
b = 2;
編譯時,編譯器發現“a = 1”後面沒有分號,就會報錯。改錯時,如果在編譯器所說的有錯的壹行中未發現錯誤,就需要看壹下上壹行是否漏掉了分號。
6. 多加分號。
{
z = x + y;
t = z / 100;
printf( "%f", t );
};
上面代碼中,大括號 } 後面的分號(;)是毫無必要的!因為單獨壹個 ; 也是合法的 C 語言語句,所以 } 後面寫了 ; 也是合法的,但是毫無必要!又如:
if ( a % 3 == 0 );
i++;
程序員的本意是如果 3 整除 a,則 i 加 1。但由於 if ( a % 3 == 0 ) 後加了分號,則 if 語句到此結束。不論 3 是否整除 a,程序都會執行 i++; 語句。再如:
for ( i = 0; i < 5; i++ ) ;
{
scanf( "%d", &x );
printf( "%d", x );
}
程序員的本意是先後輸入 5 個數,每輸入壹個數後再將它輸出。但由於for () 後加了壹個分號,循環體變為空語句 ; 。空語句 ; 執行 5 次後,下面的程序塊才開始執行,導致的結果是只能輸入壹個數並輸出它。
7. 使用 scanf 函數時忘記加取址運算符“&”。
int a, b;
scanf( "%d %d", a, b );
這樣寫是錯誤的!應該改成 scanf( "%d %d", &a, &b );
8. 輸入數據的方式與要求不符。
scanf( "%d %d", &a, &b );
輸入時,不能用逗號作兩個數據間的分隔符。例如:3, 4 。而要使用空格、回車或者 tab 鍵作為分隔符。例如:3 4 。如果我們想用逗號(,)來做分隔符,可以這樣寫:
scanf( "%d,%d", &a, &b );
此時不用逗號而用空格或其它字符是不對的。例如:3:4 。又如:
scanf("a=%d,b=%d",&a,&b);
輸入應如以下形式:
a=3,b=4
9. 輸出的數據類型與所用格式說明符不壹致。
例如,a 定義為整型,b 定義為浮點型
int a = 3;
float b = 4.5;
printf( "%f%d\n", a, b );
編譯時不給出出錯信息,但運行結果將與原意不符。這種錯誤尤其需要註意。應該改成:
printf( "%d%f\n", a, b );
10. 輸入數據時,企圖規定精度。
scanf( "%7.2f", &a );
這樣做是不合法的,輸入數據時不能規定精度。
11. switch 語句中漏寫 break 語句。
例如:根據考試成績的等級打印出百分制數段。
switch ( grade ) {
case 'A':
printf( "85~100\n" );
case 'B':
printf( "70~84\n" );
case 'C':
printf( "60~69\n" );
case 'D':
printf( "<60\n" );
default:
printf( "error\n" );
由於漏寫了 break 語句,當 grade 值為 A 時,printf 函數在執行完第壹個語句後會接著執行第二、三、四、五個 printf 函數語句。正確寫法應在每個分支後再加上“break;”。例如:
case 'A':
printf( "85~100\n" );
break;
12. 忽視了 while 和 do-while 語句在細節上的區別。
(1) int main( void )
{
int a = 0, i;
scanf( "%d", &i );
while ( i <= 10 ) {
a += i;
++i;
}
printf( "%d", a );
return 0;
}
(2) int main( void )
{
int a = 0, i;
scanf( "%d", &i );
do {
a += i;
++i;
} while ( i <= 10 );
printf( "%d", a );
return 0;
}
可以看到,當輸入 i 的值小於或等於 10 時,二者得到的結果相同。而當 i>10 時,二者結果就不同了。因為 while
循環是先判斷後執行,而 do-while 循環是先執行後判斷。對於大於 10 的數 while 循環的循環體壹次也不執行,而 do-while
語句則要執行壹次。
13. 定義數組時誤用變量。
int n = 6;
int a[n];
C99 以前,數組名後用方括號括起來必須是常量,包括常量表達式。但是在最新的 C99 標準中,上面的代碼是正確無誤的。如果您的編譯器不支持 C99 ,那麽上面的代碼不能通過編譯。
14. 在定義數組時,將定義的“元素個數”誤認為是可使的最大下標值。
int main( void )
{
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
printf( "%d", a[10] );
return 0;
}
C 語言規定:定義時如果用 a[10],則表示數組 a 有 10 個元素,其下標值範圍為0到9。a[10]不屬於上面定義的數組中。對 a[10] 進行賦值可能導致程序崩潰!
15. 在不應加地址運算符 & 的位置加了地址運算符。
char s[100];
scanf( "%99s", &s );
C 語言中,數組名代表該數組的起始地址。因此上面的代碼中,s 本身就已經是壹個地址了,我們不需要再對它進行取址運算。正確的寫法應該是:scanf( "%99s", s );