假设下面 C++ 代码执行过程中仅输入正负整数或 0,有关说法错误的是( )。
int N, Sum = 0;
cin >> N;
while (N){
Sum += N;
cin >> N;
}
cout << Sum;答案D。while循环先判断条件再执行,可能一次都不执行。do-while至少执行一次。
while先判断后执行,可能0次。do-while先执行后判断,至少1次。
【考点】while循环条件判断|cin输入流处理|布尔值与整数转换
核心在于while(N)条件判断:非0整数视为真,0视为假。每次循环先累加再读入新值,因此只要连续输入非0数就会持续执行。终止条件是遇到第一个0,此时while(N)变为假,循环退出。这类题通用思路是“模拟输入流”:把cin>>N看成状态机,while(N)就是循环入口条件,每次迭代都要更新状态。
选项A、B、C均正确:输入0直接跳出循环;非0数连续累加;首入0则Sum仍为0。选项D是典型偷换条件:原while(N)只会在遇到0时停止,绝非死循环;改成while(N==0)后循环条件永远为假(除非N初始就是0),程序连一次累加都不会执行。命题人利用初学者对“非0即真”规则的机械记忆,诱导考生误判循环终止条件。
若把while(N)改为while(N!=0),逻辑完全一致,因为非0整数在C++中真值相同;若改成while(N==0)则循环条件永远为假(除非N初始就是0),程序连一次累加都不会执行;若把while(N)改成for(int i=0;i<N;i++)则循环次数由输入值决定,而非遇到0停止。刷到类似题先问:循环到底在什么时候退出?条件表达式是“真则进”还是“假则进”?