20
2019
10

《c陷阱与缺陷》笔记

1.在c语言中,符号之间的空白(包括空格符,制表符或换行符)将被忽略

if(x>big) big=x;

还可以写出:

if

(

x

>

big

)

big

=

x

;

2.编译器将程序分解成符号的方法是,从左到右一个字符一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号

如:y=x/*p      /*p指向除数*/;

被编译器理解成

y=x        /*p      /*p指向除数*/;//后面一整块变成了注释,原意只是后面一小块成为注释

3.字符与字符串

用单引号引起的一个字符实际上代表一个整数

用双引号引起的字符串,代表的却是一个指向无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制值为零的字符'\0'初始化

4.某些c编译器对函数参数并不进行类型检查,特别是对printf函数的参数

如:printf('\n');

则会在程序运行的时候产生难以预料的错误,而不会给出编译器诊断信息  ps:我试了cfree和DEV-C++他们都会编译不通过,所以现在的编译器一般能够检测到在函数调用时混用单引号和双引号的情形

5,整型数(一般为16位或32位)的存储空间可以容纳多个字符(一般为8位),因此有的c编译器允许在一个字符常量(以及字符串常量)中包括多个字符。

#include<stdio.h>
int main(){
    int a;
    a='yes';
    printf("%d",a);
    return 0;
}
所以这个编译是成功的

注释嵌套

例子:

/*/*/0*/**/1

如果编译器允许嵌套注释,则上式将被解释为

/*   /*   /0   */   *   */   1,值为1

如果编译器不允许嵌套注释,则上式将被解释为

/*   /    */    0*    /**/     1,值为0*1=0


但是c语言定义并不允许嵌套注释,因此一个完整遵守c语言标准的编译器就别无其他选择了

理解函数声明

先了解一个知识点:c变量的声明都由两部分组成,类型以及一组类似表达式的声明符。声明符从表面上看与表达式有些类似,对它求值应该返回一个声明中给定类型的结果。

float *pf;//这个声明的含义是*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针

float *g(),(*h)();//*g(),(*h)()是浮点表达式。因为()结合优先级高于*,*g()也就是*(g()):g是一个函数,该函数的返回值类型为指向浮点数的指针。h所指向函数的返回值为浮点类型

2.一旦我们知道了如何声明一个给定类型的变量,那么该类型的类型转换符就很容易得到了:只需要把声明中的变量名和声明末尾的分号去掉,再将剩余的部分用一个括号整个“封装”起来即可
eg:float (*h)();---->(float (*)())

3.如果一个函数不需要返回值(即返回值为void),我们经常在函数声明时省略了返回值类型,但是此时对编译器而言会隐含地将函数返回值类型视作int类型

4,c语言允许初始化列表中出现多余的逗号

eg:    int a[]={1,2,3,4,5,6};

   因为int a[]={

          1,2,3,

          4,5,6,

};




« 上一篇 下一篇 »

评论列表:

1.访客  2019-10-22 04:49:22 回复该评论
挑战学习

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。