您的位置:首页 > 编程语言 > C语言/C++

《c语言深度剖析》整理--符号

2011-11-09 13:08 127 查看
一、注释符号

c语言的注释符号有两种 /*...*/ 和 //

1. 以下几种注释的形式:

A)int/*...*/i;

B)char* s="abcdefgh //hijklmn";

C)in/*…*/t i;

解析:

A 正确,编译器再编译代码之前将注释符号替换为空格 ,等价于 int i;

B正确,此处字符串中的 // 为普通的字符常量;

C错误,编译器再编译代码之前将注释符号替换为空格 ,等价于 in t i;

2、/* */ 不支持嵌套,/* 总是与之后的最近的 */ 结合

比如 /* test/* test */ test*/ 编译错误

3、宏定义#define 定义的注释符号

下面的例子:

#define BSC //

#define BMC /*

#define EMC */

D),BSC my single-line comment

E),BMC my multi-line comment EMC

解析:

D和E都是错误,因为编译器编译的时候,注释先于预处理指令被处理,编译器先将注释替换为空格,之后再进行预处理#difine 定义的替换为宏中定义的,

当这两行被展开成//…或/*…*/时,注释已处理完毕,此时再出现//…或/*…*/自然错误.因此,试图用宏开始或结束一段注释是不行的。

4. 当进行除法运算,除数为 指针所指的值的时候,注意容易解析为注释符号而报错

比如 y = x/*p , 此处编译器将/* 当做是一段注释的开始 /* 而报错,解决此问题的最好的办好是,好不吝啬 括号,而避免引起误解y = x/(*p)

5. 添加注释几个重要的规范

(1)对于全局数据(全局变量、常量定义等)必须要加注释;

因为全局变量一般是程序中多处函数要引用,若不加注释,容易引起混淆;

(2)注释采用英文,尽量避免在注释中使用缩写,特别是不常用缩写;

不同平台不同的编译器,中文注释容易引起乱码

(3)边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要及时删除;

(4)对一系列的数字编号给出注释,尤其在编写底层驱动程序的时候(比如管脚编号);

(5)注释的位置应与被描述的代码相邻,可以与语句在同一行,也可以在上行,但不可放在下方。同一结构中不同域的注释要对齐;

函数的注释一般放在代码上方;函数中语句的注释的比较长的注释一般放在代码上方,简短的注释可以放到代码的下方;

二、接续符和转义符 \

1. 接续符

以下几个接续符的例子

(1)//这是一条合法的\

单行注释

(2)cha\

r* s="这是一个合法的\

字符串";

解析: (1)(2) 都是可以正确的,可以编译通过

接续符的使用原则:C 语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。

(1)(2)若接续符\ 紧接之后加空格,编译器将不会看错是接续符而报错

(1)(2)若接续符\ 第二行加空格,编译可以通过,但是编译器会认为第二行之前的空格是注释或者字符串的一部分,显然这种期望相悖;

2. 转义字符 \

常用的转义字符及其含义:

转义字符转义字符的意义

\n 回车换行

\t 横向跳到下一制表位置

\v 竖向跳格

\b 退格

\r 回车

\f 走纸换页

\\ 反斜扛符"\"

\' 单引号符

\a 鸣铃

\ddd 1~3 位八进制数所代表的字符

\xhh 1~2 位十六进制数所代表的字符

C 语言字符集中的任何一个字符均可用转义字符来表示

表中的\ddd 和\xhh正是为此而提出的。ddd 和hh 分别为八进制和十六进制的ASCII 代码。如\102 表示字母"B",\134 表示反斜线,\X0A 表示换行等。

三、单引号和双引号

c中单引号和双引号含义不同,主要是表示的数据类型和内存中所占的空间不同,比如:

1,'1',"1"

第一个是整形常数,32 位系统下占4 个byte;

第二个是字符常量,占1 个byte;

第三个是字符串常量,占2 个byte。

注:字符在内存里是以ASCAII 码存储的,所以字符常量可以与整形常量或变量进行运算。如:'A'+ 1 (B)

四、逻辑运算符 || 和&&

|| 计算表达式,若前面表达式结果为真,整个表达式为真,将不再计算后面的表达式;

&&计算表达式,若前面表达式结果为假,整个表达式为假,将不再计算后面的表达式;

以上两点在程序设计的时候容易出错,比如

1.

view
plainprint?

int i = 0;

int j = 0;

if((++i > 0) || (++j > 0))

{

}

结果:i=1;j=0。

五、++、--操作符、逗号表达式

++、--操作符,首先注意运算符前缀还是后缀表达式;

几个++,-- 操作符的例子

1. int i = 3;

(++i)+(++i)+(++i);

vs2008 编译的结果 18(不同的编译器编译的结果可能不同)

2、int i = 3;

(i++)+(i++)+(i++);

vs2008 编译的结果 9(不同的编译器编译的结果可能不同)

3.(1)

view
plainprint?

int i = 3;

j =(i++,i++,i++);

(2)

view
plainprint?

int i = 3;

=(i++,i++,++i);

解析:逗号表达式,遇到逗号后开始计算逗号之前的表达式的值,依次计算,直到最后的逗号,将计算的结果赋值给前面的变量(注:前缀表达式和后缀表达式计算到后面括号结果不同,以最后的逗号为准)

(1)vs2008 编译的结果 5 (最后的结果等价于 int i = 5; j = i++;)

(2)[b]vs2008 编译的结果 6 (最后的结果等价于 int i = 5; j = ++i;)[/b]

4. 逗号表达式的值取决于最后逗号以后表达式的值

view
plainprint?

for(i=0, printf("First = %d", i);i < 10, printf("Second=%d",i); i++, printf("Third=%d", i))

{

printf("Fourth=%d", i);

}

解析:此处程序为死循环

i < 10, printf("Second=%d",i); 当i>=10时,printf("Second=%d",i); 函数返回的结果为真,所以整个逗号表达式的值为真,导致死循环

5.

view
plainprint?

int i = 3;

++i+++i+++i;

此处 i 与符号 + 结合的原则是什么呢?

贪心法:一个字符地读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分;如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号

所以,上面的表达式可以解析为 ((++i)++) +( i++) +i;


vs2008 编译的结果 12(不同的编译器编译的结果可能不同)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: