符号
注释
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!