zoukankan      html  css  js  c++  java
  • 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' ; 

  • 相关阅读:
    bzoj:1299: [LLH邀请赛]巧克力棒
    [51nod][cf468D]1558 树中的配对
    HDU5447 Good Numbers
    Timus Online Judge:ural:1006. Square Frames
    poj1830:开关问题
    bzoj:1776: [Usaco2010 Hol]cowpol 奶牛政坛
    bzoj:1725: [Usaco2006 Nov]Corn Fields牧场的安排
    bzoj:1828: [Usaco2010 Mar]balloc 农场分配
    bzoj:1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
    bzoj:1598: [Usaco2008 Mar]牛跑步
  • 原文地址:https://www.cnblogs.com/zhxshseu/p/5144657.html
Copyright © 2011-2022 走看看