【C语言】C语言初学者常犯的18条错误
錯誤1:scanf中丟失&
int a; printf("Enter an integer:\t"); scanf("%d", a);上面的代碼第3行,a前面漏了&
更正:
int a; printf("Enter an integer:\t"); scanf("%d", &a);錯誤2:在比較語句中使用=代替==
if (x=1)printf("Found!\n");在一般的編程語言中共有的下面的語法:
=代表賦值
==代表相等的判斷
應該這么改寫:
if (x==1)printf("Found!\n");錯誤3:索引超出數組的末端元素
int array[10]; array[10]=42;數組索引從0開始,終止于n-1,這個對長度為10的數組的索引10元素進行操作明顯是越界了。
既然是寫最后一個元素,那下標應該是9:
錯誤4:在#define語句中使用=
# define NUM = 4這里不能用等號啊~~
應該改成這樣:
錯誤5:使用未初始化的變量
int i; if (i == 10)//do something在Java里這就是最恐怖的“空指針異常(NullPointerException)”,無論在哪里都是要避免的,要有初始化再調用的好習慣:
int i = 10; if (i == 10)//do something錯誤6:未包含用戶創建頭文件的路徑
# include "myfile.h"地址路徑不對,例如:
# include "code\myfile.h"錯誤7:使用邏輯運算符(!, ||, &&)代替位運算符(~, |, &)
char x =! 5; char y = 5 || 2; char z = 5 && 2;上面的其實是邏輯運算符,我們實際上想用的是位運算符:
char x = ~5; char y = 5 | 2; char z = 5 & 2;上面的語句分別代表非、或、與。
錯誤8:在switch/case語句中遺漏break語句
char x = 'd'; //do something switch (x) {case 'u': direction = 1;case 'd': direction = 2;case 'l': direction = 3;case 'r': direction = 4;default: direction = 0; }應該有加上break的好習慣:
char x = 'd'; //do something switch (x) {case 'u': direction = 1; break;case 'd': direction = 2; break;case 'l': direction = 3; break;case 'r': direction = 4; break;default: direction = 0; }錯誤9:遺漏大括號{}
if (ptr == NULL)printf("Unable to open a file.\n");exit(1); //do somethingJava和C一樣,不加{}的話循環語句和分支語句只包含緊接著的一句。
畢竟C、Java這種語言不看縮進,不像Python。
所以exit(1)實際上式if結束以后必然會執行的語句。
應該這么寫:
錯誤10:在函數聲明之前使用函數
int main(void) {test(); }void test() {//do something }沒定義怎能使用?
所以換個順序就OK:
錯誤11:用同一個名稱聲明的局部和全局變量
int x = 5; int test(void) {int x = 3;//do something }變量命名對沖了,能避免就要避免這種事:
int x = 5; int test(void) {int y = 3;//do something }錯誤12:在數組聲明后嘗試使用{}初始化該數組
int scores[3]; scores = {93, 91, 97};不能這么搞啊,只能是下面兩種方式:
int scores[3] = {93, 91, 97}; int scores[3]; scores[0] = 93; scores[1] = 91; scores[2] = 97;錯誤13:使用=將一個數組賦值給另一個數組
int scores = {93, 91, 97}; int scores2[3]; scores2 = scores;C語言不同于Java,Java可以“數組間賦值”(其實還是用了ArrayCopy)
這么寫才是對的:
應該用一個循環給數組逐位賦值。
錯誤14:do/while循環后遺漏分號
int num; do {num = getNum(); } while (num < 100)do…while語句最后需要一個分號結尾:
int num; do {num = getNum(); } while (num < 100);錯誤15:for循環使用逗號代替分號
int i; for (i = 0, i < 200, i++)//do something一定要用分號(;)啊:
int i; for (i = 0; i < 200; i++)//do something錯誤16:整數除法代替浮點數除法
float x = 9/4;兩個整數的直接除法是生成一個截斷后的整數。
應該這么寫除法才能得到一個浮點數:
得到2.25。
錯誤17:寫入未初始化的指針
int *y = 77;這是不對的,應該這么寫:
int x, *y = &x; *y = 77;錯誤18:過大的期望(或者缺乏期望)
所謂過大的期望是說:
一個初學者可能想要編寫一個完整的程序(沒有模塊化),并且期望它第一次運行就完美運行。
對于復雜程序,模塊化是必不可少的。將大的問題自頂向下逐級分解成小問題,模塊化地進行開發正是C語言這種經典面向過程的高級編程語言的開發方法。
如果不進行合理的模塊化劃分,調試的困難程度甚至呈現指數級增長,很難以維護。
所謂缺乏期望是說:
在遇到情況時,初學者可能只去驗證該代碼是否能生成結果,而不去或者不會去驗證生成的結果是否正確。
在驗證功能方面使用已知輸入和預期結果來調試程序是很關鍵的。
總結
以上是生活随笔為你收集整理的【C语言】C语言初学者常犯的18条错误的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Java】总结Integer类的API
- 下一篇: 用博弈论的思想玩游戏(洛谷P3150题题