C陷阱和缺陷--第一章 “词法陷阱”

前言

词法分析器:编译器中负责将程序分解未一个一个符号的部分
例程

/*下面两个程序是等价的*/
// 例1
if (x > big)
	big = x;
// 例2
if (x > big) big = x;

1.1 =不同于==

不要将比较运算符和赋值运算符混淆
if (x = y) 先将y值赋给x, 然后判断的是x的值, 只要x不为0,则永远为真;
if (x == y) 判断的是x和y是否相等

int x=3;
int y=4;
if (x = y)
	printf("x value =%d \n",x);
if (x == y)
	printf("x == y \n");

赋值运算符=的优先级要低于逻辑运算符||
比较运算符误写为赋值运算符

// 期望的含义是 判断c是否是 空格符,制表符,换行符
while (c = ' ' || c == '\t' || c == '\n')
	c = getc(f);

// 实际含义为 赋值语句,while 永远为真,变为死循环
while (c = (' ' || c == '\t' || c == '\n'))
	c = getc(f);

赋值运算符误写为比较运算符: 本意是判断 open()函数的返回值是小于0,;实际变为了检查语句 file_return == open(file_name, 0) 为 true或false, 永远不可能 < 0

if ((file_return == open(file_name, 0)) < 0)
	error();

1.2 &和| 不同于 &&和||

&和| 是按位运算符,用来进行数据计算
&&和|| 是逻辑运算符,用来进行条件判断

1.3 词法分析中的贪心法

贪心法(大嘴法):如果(编译器)输入流截止至某个字符之前都已经被分解未一个个符号,那么下一个符号将包括从该字符之后可能组成一个符号的最长字符串;

a---b  等价于 a-- - b, 不能理解为  a - --b 
//  这里 /* 会被认为是注释符号/**/
y=x/*p		

// 正确的写法
y = x / *p 或  y = x / (*p)

1.4 整形常量

如果一个整形常量的第一个字符是数字0,那么该常量将被视作8进制数;
所以不要以为数字对齐,随意在前面补 0

printf("value %d-%d \n", 010,10);
// 输出 value 8-10

1.5 字符与字符串

用单引号引起的一个字符,实际上代表一个整数;
用双引号引起的字符串,代表的是一个 指向无名数组起始字符的指针;

printf("world\n");
// 上下两个函数输出的结果是一样的
char hello[]={
   'w','o','r','l','d','\n',0}
printf(hello);
// 语法错误,编译报错 warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion]
printf('\n');

// 正常输出 换行
printf("\n");

// 语法错误 warning: initialization of 'char *' from 'int' makes pointer from integer without a cast [-Wint-conversion]
char *slash='/';

// slash的值为 47
char slash='/';
printf("slash=%d \n", slash);

// slash的值为99='c', 存储范围超了
char slash='abc';
printf("slash=%d \n", slash);

相关推荐

  1. C陷阱缺陷--第一词法陷阱

    2024-02-21 06:34:01       45 阅读
  2. C语言词法陷阱

    2024-02-21 06:34:01       53 阅读
  3. C缺陷陷阱》-笔记(5)

    2024-02-21 06:34:01       42 阅读
  4. C缺陷陷阱》-笔记(8)

    2024-02-21 06:34:01       34 阅读
  5. C++的十宗罪:如何避免常见的错误陷阱

    2024-02-21 06:34:01       51 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-21 06:34:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-21 06:34:01       101 阅读
  3. 在Django里面运行非项目文件

    2024-02-21 06:34:01       82 阅读
  4. Python语言-面向对象

    2024-02-21 06:34:01       91 阅读

热门阅读

  1. 【后端】springboot项目

    2024-02-21 06:34:01       53 阅读
  2. 2.Swift Tabbar的使用

    2024-02-21 06:34:01       50 阅读
  3. vue前端docx库生成word表格 并合并单元格的例子

    2024-02-21 06:34:01       42 阅读
  4. Regular Paper, Short Paper, Demo Paper 和Poster的区别

    2024-02-21 06:34:01       53 阅读
  5. 算法-位运算

    2024-02-21 06:34:01       53 阅读
  6. 【Pytorch】各种维度变换函数总结

    2024-02-21 06:34:01       42 阅读
  7. 如何解决无法npm下载electron依赖的

    2024-02-21 06:34:01       46 阅读
  8. 配置基于 AWS CRT 的 HTTP 客户端

    2024-02-21 06:34:01       48 阅读