C陷阱与指针阅读笔记
第一章 词法 “陷阱”
1.1 = 不同于 ==
- = : 赋值运算符,赋值
- ==:关系运算符,比较
- = (优先级) < | | (优先级)
//错将 == 用作 =
int a = 0;
int b = 5;
if(a = b)
{
printf("1/n");
}
else
printf("2/n");
//输出:1
//结果分析:b的值赋给a,若b为0,输出2。
//错将 = 用作 ==
while(c = ' ' || c == '\t' || c == '\n')
{
printf("1\n");
}
//结果:进入死循环
//结果分析:' '不为0,' '的ASCII为32。无论c为何值,c = ' '都将成立,且||运算符有短路特性,运算符左为真则为真,所以会一直循环下去,输出1换行。
1.2 & 和 | 不同于 && 和 ||
-
&&和| | 具有短路功能, &和 | 没有。
-
& 和 | 用于位运算。
-
&& 和 | | 用于逻辑运算,进行条件判断。
1.3 词法分析中的“贪心法”
一个字符一个字符读入,如果该字符可能组成一个符号,那么再读入下一个字符,判断两个字符是否可以组成一个有意义的字符。如果可以,重复判断,直到不能组成一个字符。
//a--- 等同于 a-- -
a = b /*p; // 错误: /* 被解释成 注释语句,相当于a = b
a = b / *p; // 正确
a = b / (*p); // 正确
注意:不能嵌入空白(空格符、制表符和换行符)。
1.4 整形常量
八进制:0开头,例如0143。
1.5 字符与字符串
- 单引号:实际上代表一个整数,整数值对应编译器采取的字符集中的序列值。
- 双引号:代表一个指向数组的指针,末尾有一个隐藏的’\0’。
char hello1[] = "hello world";
char hello2[] = 'hello world'; //VS 2019中出现报错