C陷阱与缺陷 第一章

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 
" ,a);
a = 0215; /*八进制,以数字“0”开头*/
printf("a:%d 
" ,a);
a = 0x8D; /*十六进制*/
printf("a:%d 
" ,a);

 

现在 ”0195“  的表示方法会被编译器报错
a = 0195;   /*八进制*/

4.字符与字符串

     首先说明的是,对于字符串常量,是存储在常量区,只读数据区 .rodata里面的。
     (推荐一篇讲变量存储位置的文章http://blog.163.com/zhqh43@126/blog/static/404330272007102012451957/)
     并且,对于同样的字符串,是只存在一个副本的,在查找字符串的时候,会先去只读数据区查找有无对应字符串的存储地址,有的话,直接输出;没有才会创建新的字符串:
 
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 
" ,str); /*以16进制无符号形式输出*/
printf("Ox%x 
" ,str1);
printf("Ox%x 
" ,"test string address.");

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

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

5. 用字符给int赋值
                
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;    

 

     如果字符不足4个,那么高位补0;
                
cout <<(char )a<< endl;
cout <<(char )(a>>8)<< endl;
cout <<(char )(a>>16)<< endl;
cout <<(int )(a>>24)<< endl;

     如果字符过多,则会报错。
int a ;
a = 'abcde' ; 

原文地址:https://www.cnblogs.com/zhxshseu/p/5144657.html