第二章 符号
2.1
注释符号
知识点一:几个似是而非的注释问题
C语言的注释可以出现在C语言代码的任何地方,这句话对不?好,我们来从下面的例子分析中找出答案:
例: (a) int /*....*/i; (b)char *s="abcdefg //hijklmn";
(c) //Is it a \
valid comment?
下面我们来分析一下:(a)编译器会剔除注释,但是不是简单的剔除,而是用空格代替原来的注释; 所以(a)经过编译器后是: int i 而不是:inti
(b)用引号引起来都是字符串常量,那双斜杠也不例外;
(c)因为“\”是一个连续符。
知识点二:出色注释的基本要求
1、对于全局数据(全局变量、常量定义等)必须要加注释;
2、.注释采用英文,尽量避免在注释中使用缩写,特别是不常用的缩写;(因为不一定所有的编译器都能显示中文,所以别人打开你的代码,你的注释也许是一团乱码。还有,你的代码不一定时懂中文的人阅读);
3、注释的代码段时应注重"为何做
why" ,而不是"怎么做 how";4、.数值的单位一定要注释。
2.2
续行符和转义符
知识点一:反斜杠(\)的两种用途:
1.
“接续符" ----编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行;(注意:反斜杠之后不能有空格,反斜杠的下一行之前不能有空格);2.用作转义字符的开始标识。
例如:\n \t \b。2.3
单引号、双引号【注意】表示方式不一样,所占的内存大小也不一样。
1,‘1‘,"1"
第一个是整型常数,32位系统下占4字节。
第二个是字符常量,占1个字节。
第三个是字符串常量,占2二个字节(包括字符串结束符(‘/0‘))。
【注意】字符在内存里是以ASCAII码存储的,所以字符常量可以与整型常量或变量进行运算。如:‘A‘+1。
2.4
逻辑运算符" || " 两边只要有一个为真,其结果就为真;
"&&" 两边要同时为真,其结果才为真
【注意】||和&&是逻辑运算符,|和&是按位运算符。
【注意】小心“短路规则”。
最容易忘记规则的两个运算符:
三目运算符:(a?b:c) 当a的值为真的时候 返回b的值,否则返回c的值
逗号表达式:a,b 表达式的值为b的值
2.5
位运算符
C语言中位运算包括下面六种:
& 按位于 | 按位或
^ 按位异或(p^q=~p*q+p*~q)
~ 取反<< 左移 >> 右移
【注意】用异或^运算符可以实现对两个数的交换。(想想,交换两个整数有几种方法?异或,中间变量,先加后减,……)
【问题1】左移和右移
[1] 左移运算符"<<"是双目运算符。其功能是把"<<"左边的运算数的各二进制位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。
[2] 右移运算符">>"是双目运算符。其功能是把">>"左边的运算数的各二进制位全部右移若干位,由">>"右边的数指定移动的位数。
但注意:对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0还是1取决于编译系统的规定。Turbo C和很多系统规定为补1。
【问题2】0x01<<2+3的值为多少?结果为7吗?
// warning C4554: “<<”: 检查运算符优先级可能存在的错误;使用圆括号阐明优先级 (VS2008提示)
int ival=0x01<<2+3;// 32
因为"+"号的优先级比移位运算的优先级高。
【注意】左移和右移的位数不能大于数据的长度,而且不能小于0,否者其行为未定义。
2.6
花括号【问题】花括号的作用是什么?
char a[10]="abcd";
char b[10]={"abcd"};
//char c[10] { ="abcd" };// error
简单地说,花括号的作用就是:打包,使其中的语句成为一个整体,并与外界绝缘。
2.7
++、-- 操作符【问题】下面的结果是什么?
int i=3, j;
j=(++i)+(++i)+(++i);// j==18 (VS2008)
int i=3, j;
j=(++i)+(++i)+(++i);// j==18 (VC6.0)
j的值是多少呢?15、16、18吗?
其实对于这种情况,C语言标准并没有作出规定。
VS2008的计算过程是:i先经过3次自加后变为6,然后3个6相加得18。
VC6.0的计算过程是:先计算前两个i的和,这个时候i自加2次,2个i的和为10,然后再加上第三次自加的i得16。
贪心法:
每一个符号应该尽可能多的包含字符。
2.8 表达式2/(-2)的值是多少?
- #include <cstdio>
- int main()
- {
- int ival0=(-2)/2; // -1
- int ival1=2/(-2); // -1
- int ival2=2%(-2); // 0 equals to 4%2
- int ival3=(-2)%2; // 0 equals to -(2%2)
- int ival4=3%(-3); // 0 equals to 6%3
- int ival5=(-3)%3; // 0 equals to -(3%3)
- int ival6=2%(-3); // 2 equals to 5%3
- int ival7=(-3)%2; // -1 equals to -(3%2)
- int ival8=5%(-2); // 1 equals to 7%2
- int ival9=(-2)%5; // -2 equals to -(2%5)
- return 0;
- }
大多数编译器要求:余数与被除数的正负号相同。
2.9 运算符的优先级
版权声明:本文为博主原创文章,未经博主允许不得转载。