下列 C++ 代码执行后将输出 $1$,因为 $a$ 确实小于 $20$ 和 $10$。( )
a = 5;
cout << (a < 10 and 20);答案B。追踪程序输出时注意整数除法截断和循环条件的边界值。变量初始值对结果影响很大。
整数除法截断容易忽略!if(n%i==0)中%是取余运算不是除法。
【考点】C++运算符优先级|逻辑运算符短路|输出流行为
命题人专攻C++二级考生对运算符优先级理解模糊的痛点,用<与and的优先级错位制造陷阱。C++规定关系运算符<优先级(6)高于逻辑and(11),因此a < 10 and 20实际按(a < 10) and 20结合,而非a < (10 and 20)。
看到题先想运算符优先级,C++中关系运算符<优先级高于逻辑运算符and,所以(a < 10 and 20)等价于(a < 10) and 20。a < 10为true,true and 20按位与结果为20,输出20而非1。
错误选项B声称输出1,命题人利用考生对and的误解,误以为and是逻辑与且20会自动判断为true,或以为a < 20 and 10才成立。题目中a确实小于20和10,但表达式是a < 10 and 20,不是a < 20 and a < 10。
如果把20改成true,(a < 10 and true)输出1;如果把and改成&&,(a < 10 && 20)输出20。刷到类似题时,先问自己"运算符优先级真的是这样吗"。