C语言现代方法——笔记(一)

此文记录关于C语言现代方法阅读时整理的之前学习C语言可能会忽略的细节


1.解决/**/形式的注释的嵌套问题

比如

/*

    /*** wrong ***/

*/

这种注释嵌套不合法

可以使用

#if 0

/****  test ****/

#endif

包含想要注释的部分

 

2.C语言标识符长度问题

C89只要求编译器记住标识符的前31个字符,

C99只要求编译器记住标识符的前63个字符

———所以如无必要,不要给自己的变量起太长的名字

另外,对于类型中带有外部链接extern的标识符,

C89仅仅识别前6位,并且不区分大小写(历史原因——早期的链接器就是那样)

C99可识别前31位,区分大小写

注意:以上仅仅是C语言标准,具体能认多少字符还是看编译器实现,

编译器能做到的是“至少”满足C标准。

 

3.scanf匹配规则

空白字符:包括空格符,换行符,水平和垂直制表符,换页符

规则:

(1) 在格式串中发现"%d" "%f"之类的转换规范时,在输入流中开始匹配时忽略空白字符

(2) 系统先读格式串,如果遇到了空白字符(一个或多个),就会把它和输入流中的空白字符(零个或多个)进行匹配,也就是说scanf会先排除掉格式串和输入流中空白字符的干扰;

(3) 在遇到非空白的普通字符的时候,立即从输入流中读取下一个位置的数据进行匹配,未匹配上就异常退出。

举例:

格式串"%d/%d"可以以匹配输入"  5/    5",但是不能匹配输入"5         /5"

上面的例子中"/" 就是普通字符,

所以只有"%d  /%d" 才能匹配"5         /5"

 

4.C99对于负数的/ %操作规定

操作结果向0截取

例如-7/5 = -1  ,  -7%5 = -2

也就是说把负数当成正数对待,仅仅在考虑符号时决定是否在结果前加上"-"

 

5.左值的含义

左值表示存储在计算机内存(或寄存器--register变量)中的对象,而不是常量或计算的结果。

 

6.子表达式的求值顺序

除了带有逻辑运算符(&&    ||),条件运算符(<  <= > >= 等),逗号运算符(,)的表达式之外,

表达式中的子表达式之间并没有明确的求值顺序,

所以注意不确定的顺序可能会引起的问题,

比如c = (b = a+2) - (a = 1) 或者j = i * i++这样的可能会导致未定义行为,部分编译器会直接报错。

 

7.取余相关(对于第4条的补充)

(1) 浮点数取余函数: fmod

(2) 取余规则一定会保证

(a/b)*b + a%b =a

 

8.++ 和 -- 可以用于浮点数

 

9."短路"计算(参照第6条)

if ( (a < 3) && (b < 4) )

上述的表达式会先计算(a < 3) 后计算 (b < 4),

有明确的先后顺序,

如果左边的结果可以确定计算结果,那就无需计算右边

 

10.多级if中的else

多个if级联时,最后一个else属于最后一个"if",

即出现

if  ... //1号if

else if ... //2号if

else

时,

最后一个else属于2号if

 

11.C99中的bool类型

C99中添加的类型_Bool(实质是无符号整形),

可以通过包含 stdbool.h使用

给类型的变量赋值的时候,

任何非零值会被赋值1

 

12.switch使用

case 可以识别单独的整形变量和字符变量,

不能识别浮点和字符串

 

13.C99中for循环中可以声明语句

for (int i = 0; i< n; i++)

...

备注:for语句中声明的变量在for之外不可用

 

14.break

C语言中的break只能跳出一重循环,要跳出多重循环可以使用goto

 

15.for中的第三条语句比continue更接近一次循环的“底部”

比如

for(;i<3;i++)

    continue;

相当于

while(i<3) {

    continue;

    i++;

}

 

16.空语句的作用

空语句除了用在循环体中说明为空之外还可以与标号配合,专供goto跳跃

例如:

{

...

goto end_of_stmt;

...

end_of_stmt: ;

原因是标号不能独立存在,它后面必须有语句,所以可以放置一个空语句。

 

17.整数常亮默认类型

对于常量后面没有U,L来表明常亮类型的,

编译器默认赋予的类型优先级为:

有符号>无符号>更长类型

 

18.整数溢出

有符号数运算结果溢出,结果是未定义的,有危险

无符号数运算结果溢出时直接取模

比如无符号16位数65535+1结果为0

 

19.C99中sizeof无法确定变长数组大小

 

20.定义在函数体内的typedef无法在函数体外被识别

你可能感兴趣的:(C语言,C99)