下面程序的输出为( )。
#include <iostream>
#include <cmath>
using namespace std;
int main() {
cout << (int)log(8) << endl;
return 0;
}模拟程序执行过程,逐行跟踪变量变化,特别关注循环边界和递归终止条件。
模拟执行时注意:① 循环变量的起始和终止值;② 递归的边界条件;③ 数据类型转换和精度问题。
【考点】cmath 库函数|类型转换
命题人把这道题放在七级,就是要卡住"自然对数与整数截断"这个组合坑。绝大多数考生只会背"对数函数",却分不清 C++ 中 log 是自然对数(底数为 e),更不知道 (int) 会直接丢弃小数部分。
看到 log(8) 先想"底数是多少",再想"结果范围"。因为 $e \approx 2.718$,所以 $e^2 \approx 7.389$,$e^3 \approx 20.086$,必然有 $2 < \ln 8 < 3$。log(8) 实际值约 2.079。(int)log(8) 做类型转换时,C++ 规定取整是"截断"(向零取整),不是四舍五入,所以 2.079 变成 2。
B 项"3"是经典陷阱——考生把 log 误当成以 2 为底的对数,看到 $8=2^3$ 就选 3,完全没看函数定义。C 项"8"是更浅的误区——以为 log 就是"取 8 的某种对数",根本不知道返回值是实数。D 项"无法编译"是针对没看过 <cmath> 头文件的同学,以为 log 函数不存在。这道题最阴险之处在于"偷换概念":把常见的"以 2 为底对数"偷换成"C++ 标准库的 log"。
命题人视角:如果改成 log2(8) 答案就是 3,如果改成 (int)(log(8)+0.5) 答案就是 2。刷到类似题时,先问自己"命题人想考我什么"——是考自然对数还是对数底数?是考类型转换规则还是库函数用法?