c 陷阱与缺陷(一)

1.程序在设计时,往往得出正确的结果,但是它并不是程序员自己想要的。

  例如: 

      printf("hello world!")
          编译器进行编译时不会出现任何问题,但是结果:

          

             提示竟然出现在!的后面。因此   \ n   的使用变的尤为重要。

2. = 和 ==

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

这段程序程序员想表达的意思 当 c 为 空格、制表符、换行时,执行子程序。但是如果将== 写成 = 时,由于赋值运算符的优先级低于逻辑运算符。

‘  ’ 的ascii值为32,所以 c 永远不为0,则进入死循环。

  1 #include<stdio.h>
  2 int main()
  3 {
  4         char ch;
  5         scanf("%c",&ch);
  6         while(ch = ' ' || ch=='\t'|| ch== '\n')
  7         {
  8                 printf("******\n");
  9                 printf("%d\n",ch);
 10         }
 11         return 0;
 12 }
结果:
                       

3.编译器语法分析中的贪心法

编译器将程序分解成符号的方法是:从左到右一个一个字符的读入,如果该字符可能成为一个符号,则读入下一个字符,判断这两个字符是否为符号,如果是接着判断,直到不可能组成符号为止。

y= x/*p   /*  *p is pointed  */;  编译器会解析成y=x;

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int a=10;
  5         int *p=&a;
  6         int y;
  7         y=a/*p  /*    ********** */;
  8         printf("%d\n",y);
  9 }
     

正确写法应该(*p)加括号,或/ 与  *  之间加空格。

4.  整形的数如果 int  a=076;    // 会被编辑器解析成八进制数

  1 #include<stdio.h>
  2 int main()
  3 {
  4         int a=076;
  5         printf("%d\n",a);
  6         return 0;
  7 }

      

5. 字符与字符串:  用单引号引起的一个字符实际上代表一个整数,用双引号引起的字符串,代表一个指向无名数组的起始字符的指针,该数组被  双引号之间的字符 和 一个

                            额外的二进制字符‘\0’初始化

6.嵌套注释:   

 / */**/"*/"/*"/**/
允许嵌套   “/*”
不允许嵌套 “*/”


/*/*/0*/**/1
允许嵌套 1
不允许嵌套 0*1




 1 #include<stdio.h>
  2 int main()
  3 {
  4         printf("%s\n",/*/**/"*/"/*"/**/);
  5         printf("%d",/*/*/0*/**/1);
  6         printf("\n");
  7         return 0;
  8 }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值