文章目录
- 1.赋值运算符“=”与比较运算符“==”
- 2.按位与&,按位或|,逻辑且&&,逻辑或||
- 3.词法分析中的“贪心法”
- 4.整型常量
- 5.字符与字符串
- 6.练习
1.赋值运算符“=”与比较运算符“==”
对于赋值运算符“=”,如果用于逻辑判断时,其逻辑值是0
或者非0
值。
对于比较运算符“==”,逻辑值只有0
或者1
。
这里直接使用《C陷阱与缺陷》中的例子为大家举例。
例如:
while(c=' '||c=='t'||c=='\n')
c=gets(f);
原意是跳过文件中的空格符、制表符和换行号,而此时c被赋予了‘ ’,并且赋值运算符=的优先级要低于逻辑运算符||,因此是将以下表达式赋值给了c:
' '||c=='t'||c=='\n'
并且‘ ’的ASCII值不为0,因为逻辑运算符||中头一个表达式为真则后面的运算或判断不再进行,所以c此前不论为何值时,结果都为真,因此循环一直进行下去直到整个文件结束。
2.按位与&,按位或|,逻辑且&&,逻辑或||
按位与&:&是一个双目运算符,可以用于两个数值的计算,并且是两个数值的补码进行按位与运算。&运算符的特点是,如果两个数值比较中有一个为假则整体为假。例如1与0,1&0结果为0。
按位或|:|也是一个双目运算符,|的特点是两个数值的运算其中有一个真则结果为真。例如1|0,结果为1。
逻辑且&&:双目运算符,主要用来判断真假,或者作为一个循环语句的条件进行使用。例如x=3;if(x<4&&x>2),则能够进入该循环语句中。特点仍为两个数值的运算其中有一个假则结果为假。
逻辑或||:双目运算符,主要用来判断真假,或者作为一个循环语句的条件进行使用。例如x=3;if(x<6||x>4),则判断条件不成立,无法进入循环语句中。特点仍是两个数值的运算其中有一个真则结果为真。
&&与||逻辑运算都是从前往后开始判断的,只要某一个判断条件成立后,后面的判断条件或运算则无需继续进行。例如:x=2;y=3;if(x>3&&y=5),因为2大于3不成立,则y=5的判断语句不会再进行,||逻辑操作符也是如此。
3.词法分析中的“贪心法”
贪心法解释:编译器将程序分解成符号,从左到右一个一个字符读入,如果读入的字符组成的是字符串、有意义的符号,就继续读,直到读入的字符组成的字符串不能组成一个有意义的符号,那么该读入所组成的字符串即为一个符号。
我们直接用例子来进行说明:
例一:a- - -b其实与a-- -b是等价的,而与a- --b不同。这是什么原因呢?
因为- -是一个单目操作符,能进行减1的运算。再往后读,则为- - -,不够成一个操作符,因此- - -被分为了- -与-。
例二:y=x/*p这个表达式是什么意思?原意是将p这个指针解引用之后再用x除以 *p赋值给y,但此时并非如此。
原因是:编译器从x往后读符号遇到‘\’,此时往后继续读符号遇到‘*’,再往后读遇到p,\ *p这个字符串没有意义,因此\与 * 连在一起能够形成注释符。
4.整型常量
如果整形常量的第一个字符是数字0,那么该常量被视作八进制,例如8为一个十进制数,而08则为一个八进制数。一般写为08编译器会报错。(即使用10进制打印)
5.字符与字符串
用单引用引起的一个字符,实际是一个整形数。根据ASCII原则,每个字符对应一个十进制数。
对与双引号引起的字符串,其实质:是一个无名数组起始字符的指针,该数组被双引号之间的字符以及一个额外的二进制为0的字符串结束标志‘\0’初始化。
因此单引号实质是整形,双引号实质是指针。混用时,编译器会检查出来。
对于‘yes’这种是合法的,但是对于不同编译器,其对应整数不同。
Borland C++ v5.5和 LCC v3.6 中的做法是:忽略多余字符,最终整数值是第一个字符的整数值.
Visual C++ 6.0和 GCC v2.95中做法是:忽略多余字符,最终整数值是最后一个个字符的整数值.
6.练习
a+++++b的含义是什么?
解析:编译器a往后开始读入符号,首先读入+,再往后读为++,再往后读为+++,此时+++没有任何意义,因此先将上述表达式分为a++ +++b,在原来的基础上继续往后读,先读入+,再往后读为++,再往后读为+++,此时+++没有任何意义,因此表达式最后被分为((a++)++)+b。
原创不易,如果此篇文章对你有帮助,麻烦点个赞谢谢!