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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值