如果变量 $a$ 的值使得 C++ 表达式 sqrt(a) == abs(a),则 $a$ 的值为 $0$。( )
别急着代入0,先想代数方程√a=|a|的解集。两边平方得a²−a=0,解出a=0或1。再看C++里sqrt返回double、abs返回int,比较时int会提升为double,1.0==1完全合法。所以a不必非要是0,命题是假的。
最容易错在把√a=|a|当成只有a=0才成立,或者误以为abs(a)一定等于a,从而漏掉a=1这个完美平方数。还有学生看到sqrt和abs不同名就以为类型不同就不能比较,忘了C++里int提升为double的规则。这类题命题人就是爱用'=='伪装代数方程,专打'直觉'。
考查的是数学函数性质与C++类型转换、浮点数精确比较的结合。命题人想让你判断‘如果sqrt(a)==abs(a),则a一定为0’这个结论对不对。
先理清数学:√a=|a|两边平方得a²−a=0,解得a=0或1,且定义域a≥0,故两解均合法。再看C++:sqrt返回double,abs返回int,比较时int提升为double;当a=1时,sqrt(1)=1.0,abs(1)=1,1.0==1为真;a=0同理。结论:a不必为0,1同样满足条件,原命题为假。
拿到题先问:‘命题人是否在用浮点比较伪装代数方程?’别只背‘√x=x解为0’,要验证平方后的解集。代入法或排除法都是好招,但代入0后还得问‘还有没有其他数?’
A项‘必须为0’错在忽略了a=1这个完美平方数;命题人用‘=='伪装成代数方程,实则考浮点存储与类型提升;绝对值陷阱在于学生易默认abs(a)=a,从而误判√a=|a|的解集。若只背‘√x=x解为0’而不验证,必掉坑。
数学类题在题库共考过36题,覆盖2个考试级别(2020-2026);逐年分布:2020年1题、2024年1题、2026年13题、null年21题;分赛事:CSP入门级29题、CSP提高级7题。这类‘数学+类型’复合陷阱近年在CSP入门级高频出现,2026年单年13题说明命题人正加大数学与C++类型转换的交叉考查力度。
基于数据趋势,未来GESP二级或CSP入门级仍可能出类似‘sqrt(a)==a’或‘sqrt(a)==abs(a)’的判断题,甚至扩展到pow(a,2)==a等变体,继续考浮点比较与代数解集的匹配。暂无足够依据预测具体年份或题型细节,但‘数学函数+类型提升’这一组合大概率持续受热。