1_Lexical Pitfalls 词汇陷阱


                 第一章: 词汇陷阱:


  1.1 = is not == :


      一、 因为在C语言中更多地使用赋值语句, 所以 = 要比 == 更方便赋值:


          1、  if( x = y ) break;  //  错误,把赋值的 = 误以为是 == ;


          2、 为了跳过空格,tab,回车的循环:


             while( c = ' ' ||  c == '\t' || c == '\n' )

                  c = getc(f);

             // 错误: 错误的应用了 = , 使得 c 被赋值为 ‘ ’ ,所以语句恒为一!


          3、 避免 if 判断语句中出现错误:


              if( x = y )

                           foo();

           可以写为:

              if( ( x = y ) != 0 )

                           foo();

         使目的变得简明!!


          4、 判断一个文件是否可以正常被打开的if:


             if( ( filedesc == open(argv[i] , 0) )  < 0 )

                  error();

        

         这个语句尝试 存储文件的同时,判断是否成功;


错误: 应当为 = ,此时可以实现赋值的同时完成判断功能,



  1.2 & and | are not && or || :

      

          & 和 | 按位与;

          && 和 || 逻辑与和逻辑或;


  1.3 Greedy lexical analysis :


          判断在一个很长的语句中,个个成分之间是如何链接为一个整体的:


Token : 在C语言中多个成分组成一个完整的元素 称为 Token;


          在C语言中的解决方法是:( maximal much )


            repeatedly bite off the biggest possible piece:


                    1. move from left to right( or left to right );

                    2. taking the longest possible token each time;!!


          1、Token 的判断:


                    a---b;          表示 a-- - b ,即 (a--) - b;


          2、尝试将 y 赋值为 x 除以 *p的内容的商:


                    y = x /* p;   

错误:系统将认定 /* 为 注释, 结果将 x 的值 赋值给 y;


          3、老式的C语言编译器出现的问题:


                    C语言编译器允许接受  =+ ,和 += 是同一个意思;

如:  a =- 1; 可能表示  a = a - 1; 但也可能表示 a = -1 !



  1.4 Integer constants : (整数常量)


          需要注意的是 对于数字:


                    10 和 010 表示的是不同的数,(后者表示八进制);

          并且在许多的C语言编译器中允许出现超过八进制的数字:


例如: 0195 表示 1*8^2 + 9*8^1 + 5*8^0 !!! 所以等于 141 十进制数!


        

  1.5 Strings and Characters : (字符和字符串!)


          在C语言中 ‘’ 和 “ ” 表示两个完全不同的东西!


          对于单引号‘ ’ : 表示一个字符, 其实质是一个数字;

          对于双引号“ ”: 表示一个字符串,其实质是:

                    一个存放连续字符 和 ‘\0’ 的一个头指针!


         1. 对于字符和字符串的转化:


例如:  printf("HelloWorld\n");


         等价于: char hello[ ] = { H, e , l , l ,0 ........};



          2. 对于一个单个的反斜杠:


注:           char *Slash  = ‘\0’;           // 这是没有意义的, 反斜杠为 '\\' !!!



          3. 对于 ‘\n’ :


注:          将 printf("\n") 替换为 printf(‘\n’) 有可能发生意想不到的错误;!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值