第一篇:C語言常見錯(cuò)誤小結(jié)(定稿)
c語言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ法檢查并不象其它高級(jí)語言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶來了許多不便,尤其對(duì)初學(xué)C語言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤??粗绣e(cuò)的程序,不知該如何改起,本人通過對(duì)C的學(xué)習(xí),積累了一些C編程時(shí)常犯的錯(cuò)誤,寫給各位學(xué)員以供參考。
1.書寫標(biāo)識(shí)符時(shí),忽略了大小寫字母的區(qū)別。
main(){
int a=5;
printf(“%d”,A);}
編譯程序把a(bǔ)和A認(rèn)為是兩個(gè)不同的變量名,而顯示出錯(cuò)信息。C認(rèn)為大寫字母和小寫字母是兩個(gè)不同的字符。習(xí)慣上,符號(hào)常量名用大寫,變量名用小寫表示,以增加可讀性。
2.忽略了變量的類型,進(jìn)行了不合法的運(yùn)算。
main(){
float a,b;
printf(“%d”,a%b);}
%是求余運(yùn)算,得到a/b的整余數(shù)。整型變量a和b可以進(jìn)行求余運(yùn)算,而實(shí)型變量則不答應(yīng)進(jìn)行“求余”運(yùn)算。
3.將字符常量與字符串常量混淆。
char c;c=“a”;
在這里就混淆了字符常量與字符串常量,字符常量是由一對(duì)單引號(hào)括起來的單個(gè)字符,字符串常量是一對(duì)雙引號(hào)括起來的字符序列。C規(guī)定以“”作字符串結(jié)束標(biāo)志,它是由系統(tǒng)自動(dòng)加上的,所以字符串“a”實(shí)際上包含兩個(gè)字符:‘a(chǎn)'和‘',而把它賦給一個(gè)字符變量是不行的。
4.忽略了“=”與“= =”的區(qū)別。
在許多高級(jí)語言中,用“=”符號(hào)作為關(guān)系運(yùn)算符“等于”。如在BASIC程序中可以寫
if(a=3)then ?
但C語言中,“=”是賦值運(yùn)算符,“==”是關(guān)系運(yùn)算符。如:
if(a==3)a=b;
前者是進(jìn)行比較,a是否和3相等,后者表示假如a和3相等,把b值賦給a。由于習(xí)慣問題,初學(xué)者往往會(huì)犯這樣的錯(cuò)誤。
5.忘記加分號(hào)。
分號(hào)是C語句中不可缺少的一部分,語句末尾必須有分號(hào)。
a=1 b=2
編譯時(shí),編譯程序在“a=1”后面沒發(fā)現(xiàn)分號(hào),就把下一行“b=2”也作為上一行語句的一部分,這就會(huì)出現(xiàn)語法錯(cuò)誤。改錯(cuò)時(shí),有時(shí)在被指出有錯(cuò)的一行中未發(fā)現(xiàn)錯(cuò)誤,就需要看一下上一行是否漏掉了分號(hào)。
{ z=x+y;t=z/100;printf(“%f”,t);}
對(duì)于復(fù)合語句來說,最后一個(gè)語句中最后的分號(hào)不能忽略不寫(這是和PASCAL不同的)。
6.多加分號(hào)。
對(duì)于一個(gè)復(fù)合語句,如:
{ z=x+y;t=z/100;
printf(“%f”,t);};
復(fù)合語句的花括號(hào)后不應(yīng)再加分號(hào),否則將會(huì)畫蛇添足。
又如:
if(a%3==0);I++;
本是假如3整除a,則I加1。但由于if(a%3==0)后多加了分號(hào),則if語句到此結(jié)束,程序?qū)?zhí)行I++語句,不論3是否整除a,I都將自動(dòng)加1。
再如:
for(I=0;I<5;I++);{scanf(“%d”,&x);printf(“%d”,x);}
本意是先后輸入5個(gè)數(shù),每輸入一個(gè)數(shù)后再將它輸出。由于for()后多加了一個(gè)分號(hào),使循環(huán)體變?yōu)榭照Z句,此時(shí)只能輸入一個(gè)數(shù)并輸出它。
7.輸入變量時(shí)忘記加地址運(yùn)算符“&”。
int a,b;
scanf(“%d%d”,a,b);
這是不合法的。Scanf函數(shù)的作用是:按照a、b在內(nèi)存的地址將a、b的值存進(jìn)去?!?a”指a在內(nèi)存中的地址。
8.輸入數(shù)據(jù)的方式與要求不符。
①scanf(“%d%d”,&a,&b);
輸入時(shí),不能用逗號(hào)作兩個(gè)數(shù)據(jù)間的分隔符,如下面輸入不合法:
3,4
輸入數(shù)據(jù)時(shí),在兩個(gè)數(shù)據(jù)之間以一個(gè)或多個(gè)空格間隔,也可用回車鍵,跳格鍵tab。
②scanf(“%d,%d”,&a,&b);
C規(guī)定:假如在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數(shù)據(jù)時(shí)應(yīng)輸入與這些字符相同的字符。下面輸入是合法的:
3,4
此時(shí)不用逗號(hào)而用空格或其它字符是不對(duì)的。4 3:4
又如:
scanf(“a=%d,b=%d”,&a,&b);輸入應(yīng)如以下形式:
a=3,b=4
9.輸入字符的格式與要求不一致。
在用“%c”格式輸入字符時(shí),“空格字符”和“轉(zhuǎn)義字符”都作為有效字符輸入。
scanf(“%c%c%c”,&c1,&c2,&c3);如輸入a b c
字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因?yàn)?c只要求讀入一個(gè)字符,后面不需要用空格作為兩個(gè)字符的間隔。
10.輸入輸出的數(shù)據(jù)類型與所用格式說明符不一致。
例如,a已定義為整型,b定義為實(shí)型
a=3;b=4.5;
printf(“%f%dn”,a,b);
編譯時(shí)不給出出錯(cuò)信息,但運(yùn)行結(jié)果將與原意不符。這種錯(cuò)誤尤其需要注重。
11.輸入數(shù)據(jù)時(shí),企圖規(guī)定精度。
scanf(“%7.2f”,&a);
這樣做是不合法的,輸入數(shù)據(jù)時(shí)不能規(guī)定精度。
12.switch語句中漏寫break語句。
例如:根據(jù)考試成績(jī)的等級(jí)打印出百分制數(shù)段。
switch(grade)
{ case 'A':printf(“85~100n”);case 'B':printf(“70~84n”);case 'C':printf(“60~69n”);case 'D':printf(“<60n”);default:printf(“errorn”);
由于漏寫了break語句,case只起標(biāo)號(hào)的作用,而不起判定作用。因此,當(dāng)grade值為A時(shí),printf函數(shù)在執(zhí)行完第一個(gè)語句后接著執(zhí)行第二、三、四、五個(gè)printf函數(shù)語句。正確寫法應(yīng)在每個(gè)分支后再加上“break;”。例如
case 'A':printf(“85~100n”);break;
13.忽視了while和do-while語句在細(xì)節(jié)上的區(qū)別。
(1)main(){int a=0,I;
scanf(“%d”,&I);while(I<=10){a=a+I;I++;}
printf(“%d”,a);}
(2)main(){int a=0,I;
scanf(“%d”,&I);do
{a=a+I;I++;
}while(I<=10);printf(“%d”,a);}
可以看到,當(dāng)輸入I的值小于或等于10時(shí),二者得到的結(jié)果相同。而當(dāng)I>10時(shí),二者結(jié)果就不同了。因?yàn)閣hile循環(huán)是先判定后執(zhí)行,而do-while循環(huán)是先執(zhí)行后判定。對(duì)于大于10的數(shù)while循環(huán)一次也不執(zhí)行循環(huán)體,而do-while語句則要執(zhí)行一次循環(huán)體。
14.定義數(shù)組時(shí)誤用變量。
int n;
scanf(“%d”,&n);int a[n];
數(shù)組名后用方括號(hào)括起來的是常量表達(dá)式,可以包括常量和符號(hào)常量。即C不答應(yīng)對(duì)數(shù)組的大小作動(dòng)態(tài)定義。
15.在定義數(shù)組時(shí),將定義的“元素個(gè)數(shù)”誤認(rèn)為是可使的最大下標(biāo)值。
m ain()
{static int a[10]={1,2,3,4,5,6,7,8,9,10};printf(“%d”,a[10]);}
C語言規(guī)定:定義時(shí)用a[10],表示a數(shù)組有10個(gè)元素。其下標(biāo)值由0開始,所以數(shù)組元素a[10]是不存在的。
16.初始化數(shù)組時(shí),未使用靜態(tài)存儲(chǔ)。
int a[3]={0,1,2};
這樣初始化數(shù)組是不對(duì)的。C語言規(guī)定只有靜態(tài)存儲(chǔ)(static)數(shù)組和外部存儲(chǔ)(exterm)數(shù)組才能初始化。應(yīng)改為:
static int a[3]={0,1,2};
17.在不應(yīng)加地址運(yùn)算符&的位置加了地址運(yùn)算符。
scanf(“%s”,&str);
C語言編譯系統(tǒng)對(duì)數(shù)組名的處理是:數(shù)組名代表該數(shù)組的起始地址,且scanf函數(shù)中的輸入項(xiàng)是字符數(shù)組名,不必要再加地址符&。應(yīng)改為:
scanf(“%s”,str);
18.同時(shí)定義了形參和函數(shù)中的局部變量。
int max(x,y)int x,y,z;{z=x>y?x:y;return(z);}
形參應(yīng)該在函數(shù)體外定義,而局部變量應(yīng)該在函數(shù)體內(nèi)定義。應(yīng)改為:
int max(x,y)int x,y;{int z;
z=x>y?x:y;return(z);}
附錄:出錯(cuò)信息解釋
Ambiguous operators need parentheses 不明確的運(yùn)算需要用括號(hào)括起
Ambiguous symbol 'xxx' 不明確的符號(hào)
Argument list syntax error 參數(shù)表語法錯(cuò)誤
Array bounds missing 丟失數(shù)組界限符
Array size toolarge 數(shù)組尺寸太大
Bad character in paramenters 參數(shù)中有不適當(dāng)?shù)淖址?/p>
Bad file name format in include directive 包含命令中文件名格式不正確
Bad ifdef directive synatax 編譯預(yù)處理ifdef有語法錯(cuò)
Bad undef directive syntax 編譯預(yù)處理undef有語法錯(cuò)
Bit field too large 位字段太長(zhǎng)
Call of non-function 調(diào)用未定義的函數(shù)
Call to function with no prototype 調(diào)用函數(shù)時(shí)沒有函數(shù)的說明
Cannot modify a const object 不允許修改常量對(duì)象
Case outside of switch 漏掉了case 語句
Case syntax error Case 語法錯(cuò)誤
Code has no effect
代碼不可述不可能執(zhí)行到
Compound statement missing{ 分程序漏掉“{”
Conflicting type modifiers 不明確的類型說明符
Constant expression required 要求常量表達(dá)式
Constant out of range in comparison 在比較中常量超出范圍
Conversion may lose significant digits 轉(zhuǎn)換時(shí)會(huì)丟失意義的數(shù)字
Conversion of near pointer not allowed 不允許轉(zhuǎn)換近指針
Could not find file 'xxx' 找不到XXX文件
Declaration missing;說明缺少“;”
Declaration syntax error 說明中出現(xiàn)語法錯(cuò)誤
Default outside of switch
Default 出現(xiàn)在switch語句之外
Define directive needs an identifier 定義編譯預(yù)處理需要標(biāo)識(shí)符
Division by zero 用零作除數(shù)
Do statement must have while Do-while語句中缺少while部分
Enum syntax error 枚舉類型語法錯(cuò)誤
Enumeration constant syntax error 枚舉常數(shù)語法錯(cuò)誤
Error directive :xxx
錯(cuò)誤的編譯預(yù)處理命令
Error writing output file 寫輸出文件錯(cuò)誤
Expression syntax error 表達(dá)式語法錯(cuò)誤
Extra parameter in call 調(diào)用時(shí)出現(xiàn)多余錯(cuò)誤
File name too long 文件名太長(zhǎng)
Function call missing)函數(shù)調(diào)用缺少右括號(hào)
Fuction definition out of place 函數(shù)定義位置錯(cuò)誤
Fuction should return a value 函數(shù)必需返回一個(gè)值
Goto statement missing label Goto語句沒有標(biāo)號(hào)
Hexadecimal or octal constant too large 16進(jìn)制或8進(jìn)制常數(shù)太大
Illegal character 'x' 非法字符x
Illegal initialization 非法的初始化
Illegal octal digit 非法的8進(jìn)制數(shù)字
Illegal pointer subtraction 非法的指針相減
Illegal structure operation 非法的結(jié)構(gòu)體操作
Illegal use of floating point 非法的浮點(diǎn)運(yùn)算
Illegal use of pointer 指針使用非法
Improper use of a typedefsymbol 類型定義符號(hào)使用不恰當(dāng)
In-line assembly not allowed 不允許使用行間匯編
Incompatible storage class 存儲(chǔ)類別不相容
Incompatible type conversion 不相容的類型轉(zhuǎn)換
Incorrect number format 錯(cuò)誤的數(shù)據(jù)格式
Incorrect use of default Default使用不當(dāng)
Invalid indirection 無效的間接運(yùn)算
Invalid pointer addition 指針相加無效
Irreducible expression tree 無法執(zhí)行的表達(dá)式運(yùn)算
Lvalue required
需要邏輯值0或非0值
Macro argument syntax error 宏參數(shù)語法錯(cuò)誤
Macro expansion too long 宏的擴(kuò)展以后太長(zhǎng)
Mismatched number of parameters in definition 定義中參數(shù)個(gè)數(shù)不匹配
Misplaced break
此處不應(yīng)出現(xiàn)break語句
Misplaced continue
此處不應(yīng)出現(xiàn)continue語句
Misplaced decimal point 此處不應(yīng)出現(xiàn)小數(shù)點(diǎn)
Misplaced elif directive 不應(yīng)編譯預(yù)處理elif Misplaced else 此處不應(yīng)出現(xiàn)else Misplaced else directive
此處不應(yīng)出現(xiàn)編譯預(yù)處理else Misplaced endif directive
此處不應(yīng)出現(xiàn)編譯預(yù)處理endif Must be addressable 必須是可以編址的
Must take address of memory location 必須存儲(chǔ)定位的地址
No declaration for function 'xxx' 沒有函數(shù)xxx的說明
No stack 缺少堆棧
No type information 沒有類型信息
Non-portable pointer assignment 不可移動(dòng)的指針(地址常數(shù))賦值
Non-portable pointer comparison 不可移動(dòng)的指針(地址常數(shù))比較
Non-portable pointer conversion 不可移動(dòng)的指針(地址常數(shù))轉(zhuǎn)換
Not a valid expression format type 不合法的表達(dá)式格式
Not an allowed type 不允許使用的類型
Numeric constant too large 數(shù)值常太大
Out of memory 內(nèi)存不夠用
Parameter 'xxx' is never used 能數(shù)xxx沒有用到
Pointer required on left side of-> 符號(hào)->的左邊必須是指針
Possible use of 'xxx' before definition 在定義之前就使用了xxx(警告)
Possibly incorrect assignment 賦值可能不正確
Redeclaration of 'xxx' 重復(fù)定義了xxx
Redefinition of 'xxx' is not identical xxx的兩次定義不一致
Register allocation failure 寄存器定址失敗
Repeat count needs an lvalue 重復(fù)計(jì)數(shù)需要邏輯值
Size of structure or array not known 結(jié)構(gòu)體或數(shù)給大小不確定
Statement missing;語句后缺少“;”
Structure or union syntax error 結(jié)構(gòu)體或聯(lián)合體語法錯(cuò)誤
Structure size too large 結(jié)構(gòu)體尺寸太大
Sub scripting missing ] 下標(biāo)缺少右方括號(hào)
Superfluous & with function or array 函數(shù)或數(shù)組中有多余的“&” Suspicious pointer conversion 可疑的指針轉(zhuǎn)換
Symbol limit exceeded 符號(hào)超限
Too few parameters in call
函數(shù)調(diào)用時(shí)的實(shí)參少于函數(shù)的參數(shù)不
Too many default cases
Default太多(switch語句中一個(gè))Too many error or warning messages 錯(cuò)誤或警告信息太多
Too many type in declaration 說明中類型太多
Too much auto memory in function 函數(shù)用到的局部存儲(chǔ)太多
Too much global data defined in file 文件中全局?jǐn)?shù)據(jù)太多
Two consecutive dots 兩個(gè)連續(xù)的句點(diǎn)
Type mismatch in parameter xxx 參數(shù)xxx類型不匹配
Type mismatch in redeclaration of 'xxx' xxx重定義的類型不匹配
Unable to create output file 'xxx' 無法建立輸出文件xxx
Unable to open include file 'xxx' 無法打開被包含的文件xxx Unable to open input file 'xxx' 無法打開輸入文件xxx Undefined label 'xxx' 沒有定義的標(biāo)號(hào)xxx Undefined structure 'xxx' 沒有定義的結(jié)構(gòu)xxx Undefined symbol 'xxx' 沒有定義的符號(hào)xxx
Unexpected end of file in comment started on line xxx 從xxx行開始的注解尚未結(jié)束文件不能結(jié)束
Unexpected end of file in conditional started on line xxx 從xxx 開始的條件語句尚未結(jié)束文件不能結(jié)束
Unknown assemble instruction 未知的匯編結(jié)構(gòu)
Unknown option 未知的操作
Unknown preprocessor directive: 'xxx' 不認(rèn)識(shí)的預(yù)處理命令xxx Unreachable code 無路可達(dá)的代碼
Unterminated string or character constant 字符串缺少引號(hào)
User break
用戶強(qiáng)行中斷了程序
Void functions may not return a value Void類型的函數(shù)不應(yīng)有返回值
Wrong number of arguments 調(diào)用函數(shù)的參數(shù)數(shù)目錯(cuò)
'xxx' not an argument xxx不是參數(shù)
'xxx' not part of structure xxx不是結(jié)構(gòu)體的一部分
xxx statement missing(xxx語句缺少左括號(hào)
xxx statement missing)xxx語句缺少右括號(hào)
xxx statement missing;xxx缺少分號(hào)
xxx' declared but never used 說明了xxx但沒有使用
xxx' is assigned a value which is never used 給xxx賦了值但未用過
Zero length structure 結(jié)構(gòu)體的長(zhǎng)度為零
第二篇:C語言常見錯(cuò)誤小結(jié)
C語言常見錯(cuò)誤小結(jié)-C/C++ / C語言
C語言的最大特點(diǎn)是:功能強(qiáng)、使用方便靈活。C編譯的程序?qū)φZ法檢查并不象其它高級(jí)語 言那么嚴(yán)格,這就給編程人員留下“靈活的余地”,但還是由于這個(gè)靈活給程序的調(diào)試帶 來了許多不便,尤其對(duì)初學(xué)C語言的人來說,經(jīng)常會(huì)出一些連自己都不知道錯(cuò)在哪里的錯(cuò)誤
。看著有錯(cuò)的程序,不知該如何改起,本人通過對(duì)C的學(xué)習(xí),積累了一些C編程時(shí)常犯的錯(cuò)
誤,寫給各位學(xué)員以供參考。
1.書寫標(biāo)識(shí)符時(shí),忽略了大小寫字母的區(qū)別。main(){ int a=5;printf(“%d ”,A);} 編譯程序把a(bǔ)和A認(rèn)為是兩個(gè)不同的變量名,而顯示出錯(cuò)信息。C認(rèn)為大寫字母和小寫字母是
兩個(gè)不同的字符。習(xí)慣上,符號(hào)常量名用大寫,變量名用小寫表示,以增加可讀性。
2.忽略了變量的類型,進(jìn)行了不合法的運(yùn)算。main(){ float a,b;printf(“%d ”,a%b);} %是求余運(yùn)算,得到a/b的整余數(shù)。整型變量a和b可以進(jìn)行求余運(yùn)算,而實(shí)型變量則不允許
進(jìn)行“求余”運(yùn)算。
3.將字符常量與字符串常量混淆。char c;c= “a ”;在這里就混淆了字符常量與字符串常量,字符常量是由一對(duì)單引號(hào)括起來的單個(gè)字符,字 符串常量是一對(duì)雙引號(hào)括起來的字符序列。C規(guī)定以“”作字符串結(jié)束標(biāo)志,它是由系統(tǒng) 自動(dòng)加上的,所以字符串“a”實(shí)際上包含兩個(gè)字符:?a '和? ',而把它賦給一個(gè)字符變 量是不行的。
4.忽略了“=”與“==”的區(qū)別。
在許多高級(jí)語言中,用“=”符號(hào)作為關(guān)系運(yùn)算符“等于”。如在BASIC程序中 可以寫
if(a=3)then …
但C語言中,“=”是賦值運(yùn)算符,“==”是關(guān)系運(yùn)算符。如: if(a==3)a=b;
前者是進(jìn)行比較,a是否和3相等,后者表示如果a和3相等,把b值賦給a。由于習(xí)慣問題,初學(xué)者往往會(huì)犯這樣的錯(cuò)誤。
5.忘記加分號(hào)。
分號(hào)是C語句中不可缺少的一部分,語句末尾必須有分號(hào)。a=1 b=2 編譯時(shí),編譯程序在“a=1”后面沒發(fā)現(xiàn)分號(hào),就把下一行“b=2”也作為上一行語句的一
部分,這就會(huì)出現(xiàn)語法錯(cuò)誤。改錯(cuò)時(shí),有時(shí)在被指出有錯(cuò)的一行中未發(fā)現(xiàn)錯(cuò)誤,就需要看 一下上一行是否漏掉了分號(hào)。{ z=x+y;t=z/100;printf(“%f ”,t);} 對(duì)于復(fù)合語句來說,最后一個(gè)語句中最后的分號(hào)不能忽略不寫(這是和PASCAL 不同的)。
6.多加分號(hào)。
對(duì)于一個(gè)復(fù)合語句,如: { z=x+y;t=z/100;printf(“%f ”,t);};復(fù)合語句的花括號(hào)后不應(yīng)再加分號(hào),否則將會(huì)畫蛇添足。又如:
if(a%3==0);I++;本是如果3整除a,則I加1。但由于if(a%3==0)后多加了分號(hào),則if語句到此結(jié)束,程序?qū)?/p>
執(zhí)行I++語句,不論3是否整除a,I都將自動(dòng)加1。再如:
for(I=0;I <5;I++);{scanf(“%d ”,&x);printf(“%d ”,x);} 本意是先后輸入5個(gè)數(shù),每輸入一個(gè)數(shù)后再將它輸出。由于for()后多加了一個(gè)分號(hào),使循 環(huán)體變?yōu)榭照Z句,此時(shí)只能輸入一個(gè)數(shù)并輸出它。
7.輸入變量時(shí)忘記加地址運(yùn)算符“&”。int a,b;scanf(“%d%d ”,a,b);這是不合法的。Scanf函數(shù)的作用是:按照a、b在內(nèi)存的地址將a、b的值存進(jìn)去。“&a”指 a在內(nèi)存中的地址。
8.輸入數(shù)據(jù)的方式與要求不符。①scanf(“%d%d ”,&a,&b);輸入時(shí),不能用逗號(hào)作兩個(gè)數(shù)據(jù)間的分隔符,如下面輸入不合法: 3,4
輸入數(shù)據(jù)時(shí),在兩個(gè)數(shù)據(jù)之間以一個(gè)或多個(gè)空格間隔,也可用回車鍵,跳格鍵tab。②scanf(“%d,%d ”,&a,&b);C規(guī)定:如果在“格式控制”字符串中除了格式說明以外還有其它字符,則在輸入數(shù)據(jù)時(shí)應(yīng) 輸入與這些字符相同的字符。下面輸入是合法的: 3,4
此時(shí)不用逗號(hào)而用空格或其它字符是不對(duì)的。3 4 3:4 又如:
scanf(“a=%d,b=%d ”,&a,&b);輸入應(yīng)如以下形式: a=3,b=4
9.輸入字符的格式與要求不一致。
在用“%c”格式輸入字符時(shí),“空格字符”和“轉(zhuǎn)義字符”都作為有效字符輸入。scanf(“%c%c%c ”,&c1,&c2,&c3);如輸入a b c
字符“a”送給c1,字符“ ”送給c2,字符“b”送給c3,因?yàn)?c只要求讀入一個(gè)字符,后 面不需要用空格作為兩個(gè)字符的間隔。
10.輸入輸出的數(shù)據(jù)類型與所用格式說明符不一致。例如,a已定義為整型,b定義為實(shí)型 a=3;b=4.5;printf(“%f%dn ”,a,b);編譯時(shí)不給出出錯(cuò)信息,但運(yùn)行結(jié)果將與原意不符。這種錯(cuò)誤尤其需要注意。
11.輸入數(shù)據(jù)時(shí),企圖規(guī)定精度。scanf(“%7.2f ”,&a);這樣做是不合法的,輸入數(shù)據(jù)時(shí)不能規(guī)定精度。
12.switch語句中漏寫break語句。
例如:根據(jù)考試成績(jī)的等級(jí)打印出百分制數(shù)段。switch(grade){ case 'A ':printf(“85~100n ”);case 'B ':printf(“70~84n ”);case 'C ':printf(“60~69n ”);case 'D ':printf(“ <60n ”);default:printf(“errorn ”);由于漏寫了break語句,case只起標(biāo)號(hào)的作用,而不起判斷作用。因此,當(dāng)grade值為A時(shí),printf函數(shù)在執(zhí)行完第一個(gè)語句后接著執(zhí)行第二、三、四、五個(gè)printf函數(shù)語句。正確寫 法應(yīng)在每個(gè)分支后再加上“break;”。例如
case 'A ':printf(“85~100n ”);break;
13.忽視了while和do-while語句在細(xì)節(jié)上的區(qū)別。(1)main(){int a=0,I;scanf(“%d ”,&I);while(I <=10){a=a+I;I++;} printf(“%d ”,a);}(2)main(){int a=0,I;scanf(“%d ”,&I);do {a=a+I;I++;}while(I <=10);printf(“%d ”,a);} 可以看到,當(dāng)輸入I的值小于或等于10時(shí),二者得到的結(jié)果相同。而當(dāng)I> 10時(shí),二者結(jié)果就
不同了。因?yàn)閣hile循環(huán)是先判斷后執(zhí)行,而do-while循環(huán)是先執(zhí)行后判斷。對(duì)于大于10的
數(shù)while循環(huán)一次也不執(zhí)行循環(huán)體,而do-while語句則要執(zhí)行一次循環(huán)體。
14.定義數(shù)組時(shí)誤用變量。int n;scanf(“%d ”,&n);int a[n];數(shù)組名后用方括號(hào)括起來的是常量表達(dá)式,可以包括常量和符號(hào)常量。即C不允許對(duì)數(shù)組的
大小作動(dòng)態(tài)定義。
15.在定義數(shù)組時(shí),將定義的“元素個(gè)數(shù)”誤認(rèn)為是可使的最大下標(biāo)值。main(){static int a[10]={1,2,3,4,5,6,7,8,9,10};printf(“%d ”,a[10]);} C語言規(guī)定:定義時(shí)用a[10],表示a數(shù)組有10個(gè)元素。其下標(biāo)值由0開始,所以數(shù)組元素a[ 10]是不存在的。
16.在不應(yīng)加地址運(yùn)算符&的位置加了地址運(yùn)算符。scanf(“%s ”,&str);C語言編譯系統(tǒng)對(duì)數(shù)組名的處理是:數(shù)組名代表該數(shù)組的起始地址,且scanf函數(shù)中的輸入 項(xiàng)是字符數(shù)組名,不必要再加地址符&。應(yīng)改為:scanf(“%s ”,str);
17.同時(shí)定義了形參和函數(shù)中的局部變量。int max(x,y)int x,y,z;{z=x> y?x:y;return(z);} 形參應(yīng)該在函數(shù)體外定義,而局部變量應(yīng)該在函數(shù)體內(nèi)定義。應(yīng)改為: int max(x,y)int x,y;{int z;z=x> y?x:y;return(z);}
第三篇:c語言常見錯(cuò)誤
1.= 不等于 ==
從 Algol 派生出來的語言,如 Pascal 和 Ada,用 := 表示賦值而用 = 表示比較。而 C 語言則是用 = 表示賦值而用 == 表示比較。這是因?yàn)橘x值的頻率要高于比較,因此為其分配更短的符號(hào)。此外,C 可以多重賦值(如 a = b = c),并且可以將賦值嵌入到一個(gè)大的表達(dá)式或者語句中。這種便捷導(dǎo)致了一個(gè)潛在的問題:需要用比較的地方卻寫成了賦值。下面的語句看起來好像是要檢查 x 是否等于 y :
if(x = y)
foo();
而實(shí)際上是將 y 的值賦值給 x,并檢查結(jié)果是否非零。再看看下面的一個(gè)希望跳過空格、制表符和換行符的循環(huán):
while(c == ’ ’ || c = ’t’ || c == ’n’)
c = getc(f);
在應(yīng)該與 ’t’ 進(jìn)行比較的地方程序員錯(cuò)誤地使用了 =,而不是==。這個(gè)“比較”實(shí)際上是將’t’ 賦給 c,然后判斷 c 的(新的)值是否為零。因?yàn)?’t’ 不為零,所以這個(gè)“比較”一直為真,因此這是一個(gè)死循環(huán)。
一些編譯器會(huì)對(duì)形如 e1 = e2 的條件給出一個(gè)警告以提醒用戶。當(dāng)你確實(shí)需要對(duì)一個(gè)變量進(jìn)行賦值,然后再檢查變量是否“非零”時(shí),為了避免這種警告信息,應(yīng)顯式給出比較符。也就是將:
if(x = y)
foo();改寫為:
if((x = y)!= 0)
foo();
2.多字符符號(hào)
一些 C 符號(hào),如 /、* 或 =,只有一個(gè)字符。還有些 C 符號(hào),如 /*、== 或標(biāo)識(shí)符,具有多個(gè)字符。當(dāng)編譯器遇到緊連在一起的 / 和 * 時(shí),它必須決定是將這兩個(gè)字符識(shí)別為兩個(gè)符號(hào)還是一個(gè)單獨(dú)的符號(hào)。C 語言標(biāo)準(zhǔn)規(guī)定:“如果一個(gè)字符被識(shí)別為符號(hào),則應(yīng)該包含下一個(gè)字符看看包含此字符后構(gòu)成的字符串是否仍然可以構(gòu)成符號(hào),如果可以則繼續(xù)包含下一個(gè)字符,一直到不能構(gòu)成符號(hào)為止?!薄R虼?,如果 / 是符號(hào)的第一個(gè)字符,并且 / 后面緊隨著一個(gè) *,則這兩個(gè)字符構(gòu)成注釋符開始標(biāo)記。下面的語句看起來像是將 y 的值設(shè)置為 x 的值除以 p 所指向的值:
y = x/*p
/* p 指向除數(shù) */;
實(shí)際上,因?yàn)?/* 是注釋符開始標(biāo)記,因此編譯器會(huì)簡(jiǎn)單地“吞噬”程序文本,直到 */ 出現(xiàn)為止。換句話說,這條語句僅僅把 y 的值設(shè)置為 x 的值,而根本沒有看到 p。我們應(yīng)該將這條語句改為:
y = x / *p
/* p 指向除數(shù) */;或者:
y = x /(*p)
/* p指向除數(shù) */;
3.else 問題
考慮下面的程序片斷:
if(x == 0)
if(y == 0)
error();
else {
z = x
y;
f(&z);
}
寫這段程序的程序員的目的明顯是想將情況分為兩種:x == 0 和x!= 0。在第一種情況中,如果 y == 0,則調(diào)用 error()。第二種情況中,程序執(zhí)行 z = x
y;和 f(&z)。
然而,這段程序的實(shí)際效果卻大為不同。其原因是 else 總是與離它最近的 if 相關(guān)聯(lián)。上面那段代碼其實(shí)等價(jià)于:
if(x == 0){
if(y == 0)
error();
else {
z = x
y;
f(&z);
}
}
也就是說,當(dāng) x!= 0 發(fā)生時(shí)什么也不做。如果要達(dá)到我們想要的效果,應(yīng)該改成:
if(x == 0){
if(y == 0)
error();
} else {
z = z
y;
f(&z);
}
4.表達(dá)式求值順序
一些運(yùn)算符以一種已知的、特定的順序?qū)ζ洳僮鲾?shù)進(jìn)行求值。但另一些則不是。例如下面的表達(dá)式:
a
5.&&、|| 和!運(yùn)算符
C 規(guī)定 0 代表“假”,非零代表“真”。這些運(yùn)算符返回 1 表示“真”而返回 0 表示“假”。&& 和 || 運(yùn)算符如果可以通過左邊的操作數(shù)確定整個(gè)表達(dá)式的真假性,就不會(huì)對(duì)右邊的操作數(shù)進(jìn)行求值。!10 返回 0,因?yàn)?10 非零;10 && 12 返回 1,因?yàn)?10 和 12 的值都不是 0;10 || 12 也是 1,因?yàn)?10 非零。這個(gè)表達(dá)式中的 12 不會(huì)被求值,因?yàn)樽筮叺?10 就足夠確定整個(gè)表達(dá)式為真。同理 :10 || f()中的 f()也不會(huì)被求值。
6.下標(biāo)從零開始
C 語言中,一個(gè)具有 n 個(gè)元素的數(shù)組中沒有下標(biāo)為 n 的元素,元素的下標(biāo)是從 0 到n-1。下面的程序可能會(huì)崩潰:
int i, a[10];
for(i = 1;i
7.getchar 函數(shù)的返回值為整型(int)
請(qǐng)看以下程序:
#include
int main(void)
{
char c;
while((c = getchar())!= EOF)
putchar(c);
return 0;
}
這段代碼存在一個(gè)小小的,但已經(jīng)足以致命的錯(cuò)誤:c 被聲明為字符型(char)而不是整型。這意味著 c 可能不能正確接收 EOF,從而導(dǎo)致程序不能退出!正確的寫法是:將 char 改成int。
第四篇:常見標(biāo)點(diǎn)符號(hào)使用錯(cuò)誤小結(jié)
常見標(biāo)點(diǎn)符號(hào)使用錯(cuò)誤小結(jié)
一、問號(hào)的誤用
1、翠翠吃了一驚,低下頭去。她不明白這笑話究竟有幾分真,又不清楚這笑話是誰謅的?
2、然而她是從四叔家出去就成了乞丐的呢?還是先到衛(wèi)老婆子家然后再成乞丐的呢?
3、水生笑了一下。女人看出他笑得不像平常,“怎么了?你?”
4、這道題誰會(huì)解?李遠(yuǎn)你會(huì)嗎?趙潮。他能做出來嗎。
5、你能忘掉我嗎,你能答應(yīng)我好好的活下去嗎,你真的能做到嗎?
二、引語中句末點(diǎn)號(hào)誤用
1、老師講授白居易的《荔枝圖序》,讀到“殼如紅繒,膜如紫綃,瓤肉瑩白如冰雪,漿液甘酸如醴酪,”實(shí)在無法理解。
2、杜牧詩云:“長(zhǎng)安回望誘成堆,山頂千門次第開。一騎紅塵妃子笑,無人知是荔枝來”。
三、括號(hào)的誤用
1、傳說伊歐斯是希臘神話中“黎明”的化身,是希臘神泰坦的女兒。(指的是晨曦和朝霞)
2、例如說:“葉密鳥飛礙,風(fēng)輕花落遲。(蕭綱《折楊柳》)”
四、頓號(hào)的誤用
1、爺爺,你渡船也能下鳳灘,茨灘,青浪灘嗎?
2、她就只是反復(fù)的向人說她悲慘的故事,常常引住了三、五個(gè)人來聽她。
3、我再說一遍:我,恨,你!
4、總指揮發(fā)出點(diǎn)火命令:九八七??
常見標(biāo)點(diǎn)符號(hào)使用錯(cuò)誤小結(jié)
一、問號(hào)的誤用
1、翠翠吃了一驚,低下頭去。她不明白這笑話究竟有幾分真,又不清楚這笑話是誰謅的?
2、然而她是從四叔家出去就成了乞丐的呢?還是先到衛(wèi)老婆子家然后再成乞丐的呢?
3、水生笑了一下。女人看出他笑得不像平常,“怎么了?你?”
4、這道題誰會(huì)解?李遠(yuǎn)你會(huì)嗎?趙潮。他能做出來嗎。
5、你能忘掉我嗎,你能答應(yīng)我好好的活下去嗎,你真的能做到嗎?
二、引語中句末點(diǎn)號(hào)誤用
1、老師講授白居易的《荔枝圖序》,讀到“殼如紅繒,膜如紫綃,瓤肉瑩白如冰雪,漿液甘酸如醴酪,”實(shí)在無法理解。
2、唐代杜牧詩云:“長(zhǎng)安回望誘成堆,山頂千門次第開。一騎紅塵妃子笑,無人知是荔枝來”。
三、括號(hào)的誤用
1、傳說伊歐斯是希臘神話中“黎明”的化身,是希臘神泰坦的女兒。(指的是晨曦和朝霞)
2、例如說:“葉密鳥飛礙,風(fēng)輕花落遲。(蕭綱《折楊柳》)”
四、頓號(hào)的誤用
1、爺爺,你渡船也能下鳳灘,茨灘,青浪灘嗎?
2、她就只是反復(fù)的向人說她悲慘的故事,常常引住了三、五個(gè)人來聽她。
3、我再說一遍:我,恨,你!
4、總指揮發(fā)出點(diǎn)火命令:九八七??
第五篇:個(gè)人簡(jiǎn)歷常見錯(cuò)誤
必讀:6個(gè)簡(jiǎn)歷里常見的錯(cuò)誤
從頭到尾我也做過一些招聘工作,從簡(jiǎn)歷篩選、通知面試、面試都在進(jìn)行。發(fā)現(xiàn)很多人在簡(jiǎn)歷中犯了不少錯(cuò)誤,也許對(duì)于求職者來說是很小的問題,但是其實(shí)往往決定了一個(gè)機(jī)會(huì)的得失,覺得有必要整理出來,給大家一個(gè)提醒。
1、簡(jiǎn)歷上的電話停機(jī)或者關(guān)機(jī)狀態(tài)
這個(gè)問題一說出來,可能大家會(huì)覺得很可笑,怎么可能是一個(gè)重要問題。我也很驚訝,就我們統(tǒng)計(jì)的結(jié)果來看,篩選出的簡(jiǎn)歷,大約有20%是由于電話停關(guān)機(jī)的問題沒辦法通知到的。我總結(jié)一個(gè)原因是不少異地求職的人員到當(dāng)?shù)厍舐毢?,發(fā)送簡(jiǎn)歷的時(shí)候忘記把已經(jīng)更換的號(hào)碼在簡(jiǎn)歷上更新了;另一個(gè)是很多人使用的神州行、動(dòng)感地帶的號(hào)碼需要充值,但是覺得晚
一、兩天沒事;殊不知,每天求職的簡(jiǎn)歷成百上千,通知面試的人不可能天天跟蹤你的電話開通情況的。即使暫時(shí)不方便接聽電話,也建議可申請(qǐng)秘書臺(tái)服務(wù),不漏掉一個(gè)可能的機(jī)會(huì)。注意更新自己的簡(jiǎn)歷聯(lián)系方式,保證自己能隨時(shí)被找到,讓自己處在隨時(shí)啟動(dòng)的狀態(tài),會(huì)比其他人得到更多的機(jī)會(huì)。
2、未及時(shí)更改、更新簡(jiǎn)歷信息
尤其是求職信。往往收到一份簡(jiǎn)歷,求職信寫得懇切規(guī)范,但是到末尾一看,稱呼的“貴公司”名字原來根本不是我公司,不免大倒冷水,也對(duì)求職者的誠(chéng)意表示懷疑。另外就是不少人,求職信里頭一句還寫著“我是一個(gè)剛走出校門的學(xué)生?..”看到簡(jiǎn)歷里,原來已經(jīng)工作1-2年了。發(fā)出一份簡(jiǎn)歷是通過考慮,慎重地,但是這樣的簡(jiǎn)歷,很難讓人相信,不是隨手的游戲。
3、羅列全部實(shí)習(xí)經(jīng)歷
這在畢業(yè)生的簡(jiǎn)歷里經(jīng)常發(fā)現(xiàn)。為了提高自己的命中率,不少畢業(yè)生會(huì)在工作經(jīng)驗(yàn)?zāi)菣诎炎约核械膶?shí)習(xí)經(jīng)歷寫出來。粗看簡(jiǎn)歷,覺得有很多工作經(jīng)驗(yàn),但是仔細(xì)一看,就會(huì)發(fā)現(xiàn)很亂,各個(gè)經(jīng)歷之間是毫無關(guān)聯(lián)和邏輯的,家教、促銷、網(wǎng)絡(luò)管理等等。其實(shí)就畢業(yè)生來說,沒有實(shí)際的工作經(jīng)驗(yàn)是客觀事實(shí),用人單位不會(huì)因?yàn)槟懔_列了很多短期實(shí)踐就給你面試機(jī)會(huì),更看重的是你是否有能給自己加分的思想和與眾不同的潛力。羅列經(jīng)歷,只能讓自己的簡(jiǎn)歷看上去很雜亂。
4、大量、多次投遞崗位
一般的求職成功經(jīng)驗(yàn)是多撒網(wǎng),多投遞簡(jiǎn)歷,反正在網(wǎng)絡(luò)上多次投遞的邊際成本為0。但是這個(gè)多撒網(wǎng),指的是有的放矢地投遞,而非毫無目的。統(tǒng)計(jì)中,大約有35%的簡(jiǎn)歷是盲目投遞的,有的簡(jiǎn)歷根本不完整,只寫了姓名和電話,正文部分完全是空白;有的軟件專業(yè)畢業(yè),把所有的硬件崗位都申請(qǐng)了;有的多次被拒后,仍每天投遞;還有的幾乎投遞了公司所有的招聘崗位。如此瘋狂、不成熟的投遞方式,并不能帶來高的命中率,不了解自己,不了解職位的要求,很難讓用人單位相信你的符合度和穩(wěn)定性。真正命中率高的,往往是成熟的求職者:對(duì)招聘要求做了仔細(xì)的揣摩,根據(jù)自身?xiàng)l件和崗位符合度投遞簡(jiǎn)歷,并為面試做了認(rèn)真準(zhǔn)備。
5、簡(jiǎn)歷條理不清晰
一般的簡(jiǎn)歷模版,都會(huì)分工作經(jīng)驗(yàn)和學(xué)習(xí)經(jīng)歷兩部分,為了突出簡(jiǎn)歷,一些求職者會(huì)創(chuàng)造新的模版或者按照自己的思路填寫簡(jiǎn)歷,但是簡(jiǎn)歷篩選人每天在查閱大量的簡(jiǎn)歷,遇到標(biāo)新立異的簡(jiǎn)歷往往很頭痛,因?yàn)椴皇前闯R?guī)的條理來寫的,很難從中找到需要的信息,尤其3頁以上的簡(jiǎn)歷,更需要有非常清楚的條理。或者就是發(fā)現(xiàn)了合適的簡(jiǎn)歷,但是因?yàn)槟0鎲栴},聯(lián)系方式總要到處去找。其實(shí)建議大家就用網(wǎng)站推薦的模版比較好,清楚規(guī)范,便于理解。
6、愛用附件簡(jiǎn)歷
為了省事,一些人喜歡使用附件簡(jiǎn)歷,直接發(fā)送到公布的郵箱。但是現(xiàn)在電腦病毒越來越多,很多求職者是在網(wǎng)吧里發(fā)送簡(jiǎn)歷的,各個(gè)用人單位,尤其是大公司的郵箱,防備特別嚴(yán)格,附件發(fā)送過來的簡(jiǎn)歷,十有五、六是亂碼。打不開,也無法一一直接回復(fù)各個(gè)求職者的心情,是很難受的。
常有人在論壇上問我,為什么投遞了那么多簡(jiǎn)歷,都沒有回音?但是也有人跟帖,自己投遞的命中率是很高的。沒有回音的原因可能有很多,但是我建議,那些苦苦等待回音的人們,打開自己的簡(jiǎn)歷,看看是否有以上問題?(完)