天天看點

C語言容易犯的一些小錯誤

1、錯誤: double d=2/128;  //d将等于0.0;

   正确: doubled=2.0/128.0;  //d将等于2除以128所得的實數;

2、錯誤:for(int i=0;i<10;i++) ....

   正确:int i;

        for(i=0;i<10;i++) ....

  注:在C++中允許在for語句中定義變量,但在C語言中是不允許的。

3、錯誤:char* dir;

         scanf("%s",dir);//這樣操作的結果為dir=null。

   正确:chardir[50];

         scanf("%s",dir);//這樣操作的結果為dir=輸入的字元串。

  注:未初始化的指針為null;要用數組來存字元串,而不是指針來存字元串,是以若指針不是指向字元數組的,那麼用它來存讀入的字元串将會産生錯誤的結果(編譯時不會報錯)。

4、意圖:将字元串dir="output"連結到一個空字元串上。

   錯誤:char str[50]

        strcat(str,dir);//容易産生未知錯誤(也有可能不發生錯誤),str應該初始化為空字元串。

   正确:charstr[50]={};//将str初始化成空字元串

        strcat(str,dir);//相當于把dir複制到了str,即dir作為str的開頭,str後面還可以連接配接其他的字元串

  注:要重視初始化的作用;字元串初始化成空用str={};

5、數組a(int a[5];)作為函數f的參數時,看下面幾種函數f定義時的情況:

   錯誤:   f(int[] a);

   錯誤:   f(int[5]a);

   正确:   f(inta[]);   a相當于整型指針,sizeof(a)=8.

    正确:   f(inta[5]);   a相當于整型指針,sizeof(a)=8.

   正确:   typedef intlosertree[5];  f(losertree a); a相當于整型指針,sizeof(a)=8.對應這種

             情況,在f中改變a數組中的元素值,退出函數f後,a數組中的值真的改變了。

6、數組隻有在定義時初始化才可以使用{}對其指派,在定義語句後面另加一條語句對用{}對數組初始化是不對的;用{}對數組初始化時,{}内的值可以是變量,不必都是常量。

     錯誤:int a[5];

           a={1,2,3,4,5};  //隻有在定義時初始化才可以用{}對數組指派。

      正确:inta[5]={1,2,3,4,5};

     正确: int i,j,k,m,n;

            int a[5]={i,j,k,m,n};  //{}内可以是變量

7、用二維數組當作參數時,如int a[2][2];

      錯誤:voidtest(int array[][]){}  //不能兩個次元都不指定

      正确:voidtest(int array[][2]){}  //可以不指定最高維的次元,但是其餘的次元都要制定

     錯誤:void test(int** array){}test(a); //其實a隻是二維數組的第一個數的位址,而不是位址的位址,是以會提示類型不比對。

   同理可以推理,假如用多元數組作為參數的時候,函數定義的時候,隻有多元數組的最高維可以不指定(也可以指定),其餘維必須指定。   

8、關于優先級

關系操作符(<、>)的優先級比指派運算符(=)的優先級高。

int test=1>2;

以上語句的執行結果,test是0(代表1>2錯誤),而不是1.

9、C語言中在數組定義時不能使用這種形式:

int[10] a;
           

int[]這種形式隻能在寫函數的參數中使用。      

10、

const char *const * pp

實質上是定義了一個指向字元串的二級指針,藍色的const 限制一級指針指向的内容不能修改,紅色的const限制二級指針指向的内容不能修改。

11、C/C++中,++、--操作符的優先級比解引用操作符*的優先級高。例子如下:

int a[5]={1,5,9,14,43};
    int* ap=a;
    cout<<*ap;
    *ap++;
    cout<<"and"<<*ap<<endl;
           

以上代碼片段輸出結果是:1and5,即是對指針先進行++操作,在解引用指針的值,而不是對解引用的值進行++操作。

12、關于字元串常量和字元數組 相同内容的字元串常量,在程式中隻有一份,即指向它們的不同名稱的指針是相等。如下例:

char* str="abc";
    char* str1="abc";
    if(str==str1)
        cout<<true<<endl;
    else
        cout<<false<<endl;
           

以上代碼片段的輸出結果為:1。

而相同内容的不同的字元數組,在程式中有兩份存儲區域,隻不過他們内容相同。如下例:

const char str[]="abc";
    const char str1[]="abc";
    if(str==str1)
        cout<<true<<endl;
    else
        cout<<false<<endl;
           

以上代碼片段輸出結果為:0。