符号

注释

注释可能是大家认为比较熟悉的一个东西了,那么下面的注释哪个是对的呢?


来,慢慢看。
我们知道在预编译阶段,编译器会 将注释剔除用空格代替。 所以,A是对的。

int i;

而B的双引号中,即便是//那也是字符串的一部分,所以B也是对的。

char *s = "abcdefgh //hijklmn";

C也是对的,\ 接续符将上下两行链接起来。

//Is it a valid comment

好了,知道了一些基本的知识。那么以下代码又是啥呢?

y = x/*p; 


编译器会报错!
因为它把/*认为是注释了,而且没找到其匹配的*/
正确写法加个空格就好。

y = x / *p;

接续符和转义符

\接续符表示断行,编译器会将其剔除,在反斜杠后面的字符自动接续到前一行。
注意:接续符后面不能有空格,下一行前面也不能有空格!

#def\ ine MAC\ RO 1
//这就是一条合法的宏定义,相当于
#define MACRO 1

而且\除了可以被用作接续符,还是转义字符的开始标志。

左移和右移

左移和右移运算符是双目运算符。
左移的作用是把左边的运算数的各运算位全部左移若干位。

0x01 << 2+3

就是把0x01左移五位,结果是32。
右移运算符往右移就是了。

但是有一点要注意:
对于有符号数,在右移时,符号位也将移动。当为正数时,最高位补0,当为负数时,最高位补1。

C剖析系列就到目前为止了,因为后面的我觉得比较简单,也就懒得写了。

后会有期!

参考文献

[1] 陈正冲 石  虎.C语言深度剖析.未出版,2020.7.