C语言深度剖析学习笔记-符号

来源:互联网 发布:欧莱雅抗衰老知乎 编辑:程序博客网 时间:2024/06/05 05:47

符号

注释

1. /* */ 预处理时,编译器会使用空格替换,所以:

in/*。。。*/t i = 0; // 是错误的, gcc -E 编译后变成 in t i = 0; 

2. y = x / *p 不等于 y = x/*p,

因为编译器解析语法的时候,是从左到右,找最长的有意义的单元,对于第二段代码,编译器找到x后继续往后找,判断’x/’是否是合法的标识符或者关键字,发现不是,于是记录下’x’;

然后从’/’开始找,继续向下找,判断’/*’是否是有意义的符号,发现是,他是注释的开始,但不会停止,编译器继续往下找,判断’/*p’是不是有意义的符号,发现不是,于是记下’/*’;

再从’p’开始 …,

所以第二段语句是错误的,因为解析出来了’/*’但没解析出*/,无法配对,所以报错。

逻辑运算符

1. 存在短路现象:

int i = 0, j = 0;if ((++i > 0) || (++j > 0)) {    printf("i = %d, j = %d", i, j);}// i = 1, j = 0

或(||)运算:从左到右,发现值大于0的条件后,后面的条件不会再计算;
与(&&)运算:从左到右,发现值等于0的条件后,后面的条件不会再计算。

位运算符

位运算:按位或(|)、按位与(&)、 按位取反(~)、 按位异或(^)、 左移(<<)、 右移(>>)

  • << 左操作数的各个二进制为向左边移动右操作数个位值,高位丢弃,低位补零;
  • >> 左操作数的各个二进制为向右边移动右操作数个位值,无符号数,高位补零,有符号数,高位补符号位的数值(正数为0,负数为1);
  • << >> 的位数不能大于数据长度,不能小于0。

自增自减运算符

  • 逗号表达式中,每一个”逗号(,)“,都表示一个计算单位的结束;
  • for循环中,中间的条件表达式计算完成之后,表示一个计算单位结束;
  • “分号(;)”表示一个计算单位结束。
int i = 1;int j = (i\++, i\++, i\++); // 逗号表达式,i每遇到一个逗号就认为本计算单元结束,自加int y;//每次y与10比较完,不管比较结果,Y就认为本计算单元结束,自加,不是{}里的算完就马上加。for ( y = 0; y < 10; y\++) {    NULL;}i = 1;int k = (i\++) + (i\++) + (i\++); // i遇到;认为本次计算单元结束,把累积的三次自加全部执行一次,为6

计算单位结束后才会进行自增或者自减操作。

运算符优先级

1. 运算符优先级表

2. 运算符易错点

这里写图片描述

连接符

反斜杠(\)作为连接符时,后面不能有任何字符,即使空格也不行。

printf("This is \  perfect!\n");// 连接符后面不能加空格。// 连接符下一行中如果前面为了对齐使用了空格,空格会被当做有效字符。// 输出: This is   perfect! 
原创粉丝点击