C语言while循环练习

20道精选练习题
1. 以下关于while循环的描述中,正确的是( )
A. while循环的循环体至少执行一次
B. while循环先执行循环体,再判断条件
C. while循环的条件表达式可以是任意类型
D. while循环的条件表达式只能是关系表达式

正确答案:C

解析:while循环的条件表达式理论上可以是任意类型,C语言会将非0值视为真,0值视为假。while循环先判断条件后执行循环体,因此循环体可能一次都不执行。

2. 以下程序的输出结果是( )
#include <stdio.h> int main() { int i = 5; while(i--) printf("%d ", i); return 0; }
A. 5 4 3 2 1
B. 4 3 2 1 0
C. 5 4 3 2 1 0
D. 4 3 2 1

正确答案:B

解析:i--是后置递减,先使用i的值进行条件判断,然后再减1。当i=5时,条件为真(5),然后i减为4,输出4;当i=0时,条件为假(0),循环结束。所以输出为4 3 2 1 0。

3. 以下程序段执行后,变量s的值是( )
int i = 1, s = 0; while(i <= 5) { s += i; i++; }
A. 10
B. 15
C. 21
D. 25

正确答案:B

解析:程序计算1+2+3+4+5的值,结果为15。循环执行5次,每次将i的值累加到s中,然后i自增1。

4. 以下程序段的输出结果是( )
int x = 10; while(x > 0) { printf("%d ", x); x -= 3; }
A. 10 7 4 1
B. 10 7 4
C. 10 7 4 1 -2
D. 10 7 4 1 -2 ...

正确答案:A

解析:初始x=10,输出10后x减3变为7;输出7后x减3变为4;输出4后x减3变为1;输出1后x减3变为-2,此时x>0为假,循环结束。所以输出为10 7 4 1。

5. 以下关于循环的叙述中,错误的是( )
A. 循环条件表达式可以是赋值表达式
B. 循环体可以是空语句
C. 循环体中可以包含多个语句
D. 循环条件表达式必须是关系表达式或逻辑表达式

正确答案:D

解析:循环条件表达式可以是任意类型的表达式,C语言会将非0值视为真,0值视为假。它不必须是关系表达式或逻辑表达式。

6. 以下程序段的功能是( )
int n, sum = 0; scanf("%d", &n); while(n > 0) { sum += n % 10; n /= 10; }
A. 计算n的阶乘
B. 计算n的各位数字之和
C. 将n逆序输出
D. 判断n是否为素数

正确答案:B

解析:n%10获取n的个位数,累加到sum中;n/10去掉n的个位数。循环直到n为0,实现了计算n的各位数字之和的功能。

7. 以下程序段中循环体的执行次数是( )
int k = 10; while(k = 0) k--;
A. 0次
B. 1次
C. 10次
D. 无限次

正确答案:A

解析:注意条件表达式是k=0,这是一个赋值表达式,将0赋给k,然后表达式的结果为0(假),所以循环体一次都不执行。

8. 以下程序段的输出结果是( )
int a = 1, b = 10; do { b -= a; a++; } while(b-- < 0); printf("a=%d,b=%d", a, b);
A. a=3,b=0
B. a=2,b=8
C. a=2,b=7
D. a=3,b=-1

正确答案:B

解析:第一次循环:b=10-1=9,a=2;条件判断b--<0,先判断9<0为假,然后b减1变为8。循环结束,输出a=2,b=8。

9. 以下程序段的输出结果是( )
int i = 0, sum = 0; while(i < 10) { if(i % 2 == 0) sum += i; i++; } printf("%d", sum);
A. 20
B. 25
C. 30
D. 45

正确答案:A

解析:程序计算0到9之间所有偶数的和:0+2+4+6+8=20。

10. 以下程序段的输出结果是( )
int i = 1; while(i <= 5) { printf("%d ", i * i); i++; }
A. 1 2 3 4 5
B. 1 4 9 16 25
C. 1 4 9 16
D. 2 4 6 8 10

正确答案:B

解析:循环变量i从1到5,每次输出i的平方:1, 4, 9, 16, 25。

11. 以下程序段的输出结果是( )
int i = 10; while(i > 0) { if(i % 3 == 0) printf("%d ", i); i--; }
A. 9 6 3
B. 10 7 4 1
C. 9 6 3 0
D. 10 9 8 7 6 5 4 3 2 1

正确答案:A

解析:循环从10递减到1,输出能被3整除的数:9, 6, 3。

12. 以下程序段的输出结果是( )
int i = 1, j = 1; while(i + j < 10) { printf("%d ", i + j); i++; j += 2; }
A. 2 4 6 8
B. 2 5 8
C. 2 4 6
D. 2 5 8 11

正确答案:B

解析:第一次循环:i+j=2<10,输出2,然后i=2,j=3;第二次:i+j=5<10,输出5,然后i=3,j=5;第三次:i+j=8<10,输出8,然后i=4,j=7;第四次:i+j=11>=10,循环结束。所以输出2 5 8。

13. 以下程序段的输出结果是( )
int i = 0; while(i++ < 5) printf("%d ", i);
A. 0 1 2 3 4
B. 1 2 3 4 5
C. 0 1 2 3 4 5
D. 1 2 3 4

正确答案:B

解析:i++是后置递增,先使用i的值进行比较,然后i加1。第一次:0<5为真,i变为1,输出1;最后一次:4<5为真,i变为5,输出5;然后5<5为假,循环结束。所以输出1 2 3 4 5。

14. 以下程序段的输出结果是( )
int i = 1, sum = 0; while(i <= 10) { if(i % 2 == 1) sum += i; i++; } printf("%d", sum);
A. 25
B. 30
C. 55
D. 45

正确答案:A

解析:程序计算1到10之间所有奇数的和:1+3+5+7+9=25。

15. 以下程序段的输出结果是( )
int i = 5; while(--i) printf("%d ", i);
A. 5 4 3 2 1
B. 4 3 2 1
C. 5 4 3 2 1 0
D. 4 3 2 1 0

正确答案:B

解析:--i是前置递减,先减1再使用。第一次:i减为4,条件为真(4),输出4;最后一次:i减为1,条件为真(1),输出1;然后i减为0,条件为假(0),循环结束。所以输出4 3 2 1。

16. 以下程序段的输出结果是( )
int i = 1, j = 1; while(i < 5) { j = j * i; i++; } printf("%d", j);
A. 10
B. 24
C. 120
D. 15

正确答案:B

解析:程序计算1*2*3*4=24,即4的阶乘。

17. 以下程序段的输出结果是( )
int i = 0; while(i < 3) { int j = 0; while(j < 2) { printf("%d,%d ", i, j); j++; } i++; }
A. 0,0 0,1 1,0 1,1 2,0 2,1
B. 0,0 1,0 2,0 0,1 1,1 2,1
C. 0,0 0,1 1,0 1,1
D. 0,0 0,1 0,2 1,0 1,1 1,2

正确答案:A

解析:外层循环i从0到2,内层循环j从0到1。对于每个i值,j会遍历0和1。所以输出为:0,0 0,1 1,0 1,1 2,0 2,1。

18. 以下程序段的输出结果是( )
int i = 10, sum = 0; while(i > 0) { if(i % 2 == 0) sum += i; i--; } printf("%d", sum);
A. 25
B. 30
C. 20
D. 55

正确答案:B

解析:程序计算10到1之间所有偶数的和:10+8+6+4+2=30。

19. 以下程序段的输出结果是( )
int i = 1; while(i <= 10) { if(i == 5) break; printf("%d ", i); i++; }
A. 1 2 3 4
B. 1 2 3 4 5
C. 1 2 3 4 5 6 7 8 9 10
D. 1 2 3 4 6 7 8 9 10

正确答案:A

解析:当i等于5时,执行break语句,立即终止循环。所以只输出1 2 3 4。

20. 以下程序段的输出结果是( )
int i = 0; while(i < 5) { i++; if(i == 3) continue; printf("%d ", i); }
A. 1 2 4 5
B. 1 2 3 4 5
C. 1 2 4
D. 1 2 3 4

正确答案:A

解析:当i等于3时,执行continue语句,跳过本次循环的剩余部分(不输出3),直接进入下一次循环。所以输出1 2 4 5。