一、注释符号
A) int/*...*/i
B) char *s = "abcd //efjh"
C) //Is it a \
valid comment?
D) in/*...*/t i
上面的A),B),C)都是正确的。D)是错误的。
注释符号有两种:/*...*/ 和 //
注意:/*...*/ 这种形式的注释不能嵌套,因为/* 总是与离它最近的 */ 匹配。
/*这是/*非法的*/*/
1、y = x/*p
上面的代码,编译器把/* 当作是一段注释的开始,因为没有找到 */ 所以提示出错
我们可以改一下:
y = x / *p;
此时,就是正确的了。
也就是说:只要斜杠(/)和星号(*)之间没有空格,都会被当作注释的开始,否则就是两个符号啦。
2、出色注释的基本要求
(1)注释应当准确,易懂,防止有二义性
(2)保证代码和注释的同步
(3)注释应当简单明了
(4)一目了然的语句不要加注释
(5)对于全局数据,必须要加注释
(6)注释尽可能采用英文,避免在注释中使用缩写,特别是不常用的缩写
(7)注释的位置应该与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可以在下行。同一结构中不同域的注释要对齐
(8)注释的缩进要与代码一致
(9)当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读
(10)注释代码段时应注重“why”,而不是怎么做"how"
(11)数值的单位一定要注释
(12)对变量的范围给出注释
(13)对于函数的入口出口数据给出注释
二、接续符和转义符
(1)、(\)表示断行,编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。
但要注意:
反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。
#defi\
ne MAC\
RO 10 这是一条合法的\
宏定义
(2)、(\)还可以被用作转义字符的开始标识
\n 回车换行
\t 横向跳转到下一制表位置
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜杠符”\”
\' 单引号
\a 鸣铃
\ddd 1~3位八进制数所代表的字符
\xhh 1~2位十六进制数所代表的字符
三、单引号,双引号
1,'1' ,"1"
这三者的区别:
第一个是整形数据,在32位的系统下占4个byte
第二个是字符常量,占1个字节
第三个是字符串常量,占2个字节
字符在内存中是以ASCAII码存储的,所以下面的是正确的:‘A’+1
四、逻辑运算符
|| 和&&
这两个运算符都应该注意:
int i = 0;
int j = 0;
if(( ++i > 0) || (++j > 0))
{
}
最后输出i = 1, j = 0
五、位运算符
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移,双目运算符。其功能把“<<”左边的运算数的各位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,彽位补0
>> 右移,功能和左移一样,变成向右移动。但要注意:对于有符号数,在右移时,符号位将随同移动。
当为正数时,最高位补0;
当为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。
(1)0x00<<2+3结果是32.因为“+”号的优先级比移位运算符的优先级高。
(2)左移和右移的位数不能大于数据的长度,也不能小于0
六、花括号
char a[10] = {"abcd"};
七、++, --操作符
int i = 3;
( ++i ) + (++i) + (++i)
最后的运算结果,根据编译器,可能是16,可能是18,但不可能是15.
A) j = (i++, i++, i++);
B) for( i = 0; i < 10; i++)
{
}
C) k = (i++) + (i++) + (i++);
分析:
A)逗号表达式,i 在遇到每个逗号后,认为本计算单位已经结束,i 这时候自加。所以 j = 2
例:
int x;
int i = 3;
x = (++i, i++, i+10);
最后,x = 15, i = 5;
B)i 与 10比较完之后,i 自加
C)i 遇到分号才认为本计算单位已经结束,i 这时候自加
所以 k = 0
例:a+++b 可以等价于表达式: a++ +b
判断这个的方法:
贪心法
八、2/(-2)的值是多少
很多编译器:余数和被除数的正负号相同。