栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

《C陷阱与缺陷》第一章:词法“陷阱”

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

《C陷阱与缺陷》第一章:词法“陷阱”

文章目录
  • 词法“陷阱”
    • 1.1 "=" 不同于 "=="
    • 1.2 & 和 | 不同于 && 和 ||
    • 1.3 词法分析中的“贪心法”
    • 1.4 整型常量
    • 1.5 字符与字符串
    • 总结与练习
      • 练习1-1:
      • 练习1-2:

  • AndrewKoenig自己在Bell实验室时发表的论文为基础,结合自己的工作经验扩展成这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。
  • 这本书可以当做补充材料来看,在遇到问题时有个排查方向。
词法“陷阱” 1.1 “=” 不同于 “==”

  在某些时候我们可能因为大意误将 ==写成=。导致程序在判断是出现错误。经常发生在条件语句下。比如:
    while(c = ' ' || c == 't' || c == 'n') c = getc(f);

  由于在比较字符 c与 ' '时候,误将==写成=,因此实际上是将以下表达式的值赋值给c。表达式: ' ' || c == 't' || c == 'n'由于' '的ASCII码值是固定不为0的,所以无论c为何值整个循环将一直进行下去,形成一个死循环。
  如果把赋值运算写成比较运算一样容易混淆:
    if((filedesc == open(argv[i], 0)) < 0) error();

1.2 & 和 | 不同于 && 和 ||
  • 这个问题一般应该不会发生。
1.3 词法分析中的“贪心法”

   C语言的某些符号,例如/、* 和 =,只有一个字长,称为单字符符号。 其他符号例如/* 和 ==包括多个字符的称为多字符符号。
   在C编译器中将程序分解成符号的方法是,从左到右一个字符一个字符的读入,如果该字符可能组成一个符号,那就在读下一个字符,判断两个字符是否是一个符号的组成部分;如果是继续向下读,直到读的字符不能再组成一个有意义的符号为止。
   需要注意符号的中间不能用空格例如==是一个符号而= =是两个符号。
      表达式a---b与表达式a-- -b含义相同,而与表达式a- --b不同。

1.4 整型常量

   如果一个整型常量的第一个数字是0那么这个数一般表示为八进制数。因此10与010的含义是截然不同的。虽然一般都不会在前面加0吧。

1.5 字符与字符串

   C中单引号与双引号的含义是截然不同的。某些情况两个符号写错是不会报错的。
   下面这个两个printf语句是等效的。

printf("hello worldn");
char hello[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', 'n', 0,};
printf(hello);

   char *a = '/';在编译的时候可能会生成一条错误信息或警告。因为单引号中的元素,是一个int型的值;将这个值赋值给一个指针在调用的时候大概率会导致程序崩溃。

总结与练习

   这些小毛病平时不会出现,但如果因为大意出现了,找错往往是一部血泪史。

练习1-1:

   某些C编译器允许嵌套注释。请写一个测试程序,要求:无论是对于允许嵌套的编译器,还是对于不允许嵌套的编译器,该程序都能正常编译,但两种情况截然不同。

练习1-2:

   a+++++b的含义是什么?

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846907.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号