一.注释符号
1.例如:
(A)/* ...*/i;
(B)char *s ="abcdefgh //hijkmn";
(C)//Is it a\
valid comment?
(D)in/* ...*/t i;
A,B,C 的注释都是正确的,A中编译器会将注释剔除,都是不是简单的剔除 ,而是用空格代替原来的注释,也因为如此D错误;B中用双引号括起来的是字符常量,那 双斜杆也不例外;C中\是一个接续符。
2.接续符和转义
\n | 回车换行 |
\t | 横向跳到下一制表位置 |
\v | 竖向跳格 |
\b | 退格 |
\f | 走纸换页 |
\ | 反斜杆符 |
\‘ | 单引号符 |
\a | 鸣铃 |
\ddd | 1~3位八进制所代表的字符 |
\xhh | 1~2位十六进制所代表的字符 |
3.单引号与双引号
双引号扣起来、括起来的是字符串常量,单引号括起来的是字符常量。
例如:1,‘1’,“1”
第一个是整型常数;32位系统下占4字节
第二个是字符常量,占一个字节
第三个是字符串常量,占两个字节
4.逻辑运算符
||两边的条件只要有一个为真,则结果为真,&&两边的条件只要有一个为假,则结果为假。
5.位运算符
有一下相关规定:
(1)位运算符不能用于基本类型是有符号的操作数
(2)一元减运算符不能用在基本类型无符号的表达式上,除非在使用之前对两个操作数进行大小判断,且被减数大于减数。
6.左移和右移
左移运算符(<<)其功能是:把<<左边的运算数的各二进位全部左移若干位,由<<右边的数指定移动的位数,高位丢弃,低位补1。
右移运算符(>>)其功能是:把>>右边的运算数的各二进位全部右移若干位,由<<右边的数指定移动的位数,但是要注意的是:对于有符号数,在右移时,符号位将随同移动,当为正数时,最高位补0,为负数时。符号位为1,最高位是补0还是补1取决于编译系统决定。
7.++,–
例1:
int i = 3;
(++i)+(++i)+(++i);
有的编译器计算出来是18 ,因为i经过3次自加后变为6,然后3个6相加得18;而有道编译器计算出来为16,因为先计算前两个i的和,这时候i自加两次,1个i的和为10;然后再加上第3次自加的i得16。
例2:
(1)j=(i++,i++,i++);
(2)for(i=0;i<10;i++)
{
//code
}
(3)k=(i++)+(i++)+(i++);
(1)为逗号表达式,i遇到每个逗号后,认为本计算单已经结束,i这时候自加。
(2)例子中i与10进行比较之后,认为本计算单位已经结束,I这时候自加
(3)i遇到分号才认为本计算已经结束,i这时候自加
二.运算符的优先级
1.优先级表
2.一些容易出现错误的优先级问题
(1). 的优先级高于 *
例如: *p.f :对p取f偏移,作为指针,然后进行指针解引用操作。
(2) [ ] 高于 *
例如:int *ap[ ] ; :ap是一个元素为int指针的数组。
(3)函数()高于 *
例如: int * fp; :fp是一个函数,返回int *。
(4)== 和 !=高于位操作
例如:(val & mask ! =0) :实际结果是;val &(mask != 0)
(5)== 和!= 高于赋值符
例如:c = getchar() != EOF 实际结果是:c=(getchar() !=EOF)
(6)算术运算符高于位移运算符
例如:msb <<4+lsb 实际结果为:msb <<(4+lsb)
(7)逗号运算符在所有运算符中优先级最低
例如:i=1,2;实际结果为:(i=0),2