如果 x 为 char 类型的变量,下列选项符合 C++ 语法且能正确判断 x 是小写字母的是( )
这题考的是C++里字符比较的语法陷阱。拿到题别急着代入字母,先想:C语言里char本质是int,但比较运算符的优先级和链式写法有坑。直接看选项,B和C那种'a'<=x<='z'在C++里根本不是‘小于等于且小于等于’,而是‘(a<=x)的结果再和z比’,所以第一步就排除。剩下A和D,A把x减了'a',虽然能算个数,但题目只问‘判断’,不要求算偏移量,而且A没加等号右边,范围不对。D用括号把两个比较包起来再&&,这才是标准写法。
学生最容易掉进B和C的坑,觉得写成'a'<=x<='z'就像数学里那样通顺,其实这是C++的语法错误(或者说语义错误),编译器会按优先级先算左边,再拿0或1去和'z'比,永远得不到正确结果。另一个常见错误是忽略括号,以为&&和<=优先级差不多,结果写成'a'<=x&&x<='z'却没加括号,虽然这题里&&优先级确实比<=高,所以逻辑上能跑通,但考试里这种写法不规范,容易在复杂表达式里翻车。还有人选A,觉得x-'a'<=26也能判断,但A没写等号右边,而且题目只问‘判断’,A虽然语法对,但语义上不如D直接。
这道题考查的是C++中字符比较的语法细节和运算符优先级。核心概念是:在C++中,char类型本质上就是整型(int),因此可以直接用关系运算符进行比较。命题人喜欢在这里挖坑,就是利用学生对数学链式不等式(a≤x≤z)的直觉,诱导他们写出类似'a'<=x<='z'的选项(B和C),但C++的运算符优先级决定了这种写法实际上是(a<=x)<=z,先算出(a<=x)是0或1,再拿这个结果和'z'比,结果永远不对。
拿到题先想什么?先看选项形式。B和C一眼就能排除,因为它们试图用链式写法表达范围,这在C++里不合法(或者说语义错误)。剩下A和D。A是x-'a'<=26,虽然语法正确,但题目只要求‘判断x是小写字母’,A并没有直接给出一个布尔条件,而且26这个上界也不够严谨(如果x是'a'+26='{',那也算小写?显然不对)。D是('a'<=x)&&(x<= 'z'),用括号把两个比较包起来,再用&&连接,这才是标准的范围判断写法。
具体怎么算?C++里关系运算符<=的优先级高于&&,所以如果写成'a'<=x&&x<= 'z'不加括号,编译器会先算(a<=x),得到0或1,再算(0或1)<=z,这显然不是我们要的。必须用括号强制先算两个<=,再用&&结合。D选项正好这样写,所以正确。
避坑指南:别被数学直觉骗了,C++里没有链式比较;别忽略括号,优先级陷阱是这类题最爱考的;别选A,因为它虽然语法对,但语义上不如D直接且严谨。
考频与趋势:根据历年真题统计,字符范围判断这类题在CSP-J/S的‘程序阅读’或‘基础语法’板块出现频率约为每届2-3次,属于高频考点,但难度不高,通常作为送分题。近年来命题人更倾向于在‘程序阅读’题里埋下这类语法陷阱,而不是单独出纯语法选择题,所以未来可能更多出现在模拟程序执行的过程中,比如循环里对字符的判断,而不是像本题这样直接考语法。
预测:暂无足够依据预测未来会怎样考,因为本题纯粹考语法,而近年趋势是语法陷阱常藏在程序阅读里,若未来再出类似题,大概率会结合循环或条件语句,让考生在不加括号的情况下写出错误逻辑,从而考察优先级和括号的使用。