您的位置:首页 > 其它

C陷阱与缺陷 第一章

2016-01-20 11:53 211 查看
1. 使用 e1=e2的赋值方式 作为 条件语句内部的判断,请使用显示的判断
不使用:

if( x =y )
foo();


而使用:

if( (x = y) != 0)
foo();


2. 注意编码规范,一定要在赋值号 “=”两边,写上空格,以避免如下的 无意识错误。

本来想写成:

a = -1;


但是没有加空格:

a=-1;


这会被编译器翻译成:(这里猜测应该是很老的编译器才有这种解释,现在都是用 “+=”和“-=”运算符)

a = a - 1;


3.进制的表示

int a ;
a = 141;  /*十进制*/
printf("a:%d \r\n" ,a);
a = 0215; /*八进制,以数字“0”开头*/
printf("a:%d \r\n" ,a);
a = 0x8D; /*十六进制*/
printf("a:%d \r\n" ,a);




[align=left]现在 ”0195“ 的表示方法会被编译器报错[/align]

a = 0195;   /*八进制*/






4.字符与字符串

[align=left] 首先说明的是,对于字符串常量,是存储在常量区,只读数据区 .rodata里面的。[/align]
[align=left] (推荐一篇讲变量存储位置的文章http://blog.163.com/zhqh43@126/blog/static/404330272007102012451957/)[/align]
[align=left] 并且,对于同样的字符串,是只存在一个副本的,在查找字符串的时候,会先去只读数据区查找有无对应字符串的存储地址,有的话,直接输出;没有才会创建新的字符串:[/align]

char * str = "test string address.";
char * str1 = "test string address.";
cout<<hex<<(int)( str)<<endl;/*以16进制无符号形式输出*/
cout<<(int )(str1)<< endl;
cout<<(int )("test string address.")<< endl;;
printf("Ox%x \r\n" ,str); /*以16进制无符号形式输出*/
printf("Ox%x \r\n" ,str1);
printf("Ox%x \r\n" ,"test string address.");


分别用C和C++的输出流,输出”test string address.”的地址,发现是一样的。



[align=left] [/align]
[align=left]对于printf()函数来说,内部传入的是字符串的地址,所以要分清楚[/align]
[align=left]字符 ('n' '\r'……用单引号,传递的是值,字符等价于一个整数,对应其ASCII码)[/align]
[align=left]和[/align]
[align=left]字符串("n","\r"……用双引号,传递的是地址,这个从上面的例子,直接把"test string address." 传给printf()函数可以看出)[/align]
[align=left]的区别[/align]

printf('\n' ); /*报错*/
printf("\n" );




[align=left]5. 用字符给int赋值[/align]

int a ;
a = 'yes' ;


这时候,相当于把 int 变量当作一个 char [4]的数组,'yes'会被高位对高位,低位对低位的填充进a中。

cout <<(char )a<< endl;
cout <<(char )(a>>8)<< endl;
cout <<(char )(a>>16)<< endl;
cout <<(char )(a>>24)<< endl;




[align=left] 如果字符不足4个,那么高位补0;[/align]

cout <<(char )a<< endl;
cout <<(char )(a>>8)<< endl;
cout <<(char )(a>>16)<< endl;
cout <<(int )(a>>24)<< endl;




如果字符过多,则会报错。

int a ;
a = 'abcde' ;


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: