文章目录
- 1. if代码块不带大括号
- 问题描述
- 示例与分析
- 解决办法
- 2. if条件和大括号之间加了一个分号
- 问题描述
- 示例与分析
- 解决办法
- 3. 使用`=`号判断相等
- 问题描述
- 示例与分析
- 解决办法
- 4. while循环的无限循环
- 问题描述
- 示例与分析
- 解决办法
- 5. for循环中的off-by-one错误
- 问题描述
- 示例与分析
- 解决办法
控制结构if和循环是代码中必不可少的元素,这两种控制结构非常重要,但很容易掌握。
对于初学者来讲,有三个坑是要我们特别注意的。
1. if代码块不带大括号
问题描述
在C语言中,if
语句后面如果没有加上大括号{}
,那么只有紧跟着if
的下一个语句会被视为条件满足时执行的代码块。
这经常导致意料之外的结果,尤其是当你以为多个语句都会被执行时。
示例与分析
int score = 85;
if (score > 60)
printf("及格了!");
printf("继续努力!");
这段代码看起来像是想说如果分数大于60,就打印“及格了!”和“继续努力!”。
但实际上,不论条件是否满足,“继续努力!”都会被打印出来,因为第二个printf
语句并不受if
控制。
解决办法
始终使用大括号包裹if
语句块,即使只有一条语句。
if (score > 60) {
printf("及格了!");
printf("继续努力!");
}
2. if条件和大括号之间加了一个分号
问题描述
有时候,可能是因为误操作或对语法理解不深,开发者会在if
条件语句后直接跟了一个分号。
这样做实际上使if
语句变成了一个没有执行体的空语句,之后的大括号块和if判断毫无关系,将无条件执行。
示例与分析
int age = 18;
// 注意if判断的分号,导致if结构到此结束,后续的代码和这个if判断无关
if (age >= 18);
{
printf("可以投票了!");
}
这里,由于分号的存在,if
条件实际上不起作用,printf
语句总是会被执行,无论年龄是多少。
解决办法
移除条件判断后的分号,确保if
语句正确关联其执行块。
if (age >= 18) {
printf("可以投票了!");
}
3. 使用=
号判断相等
问题描述
新手程序员常犯的一个错误是在if
条件中使用赋值运算符=
而非比较运算符==
来判断两个值是否相等。
这不仅会导致逻辑错误,还可能因为赋值表达式本身有值(即被赋的值),使得条件判断意外地“通过”。
示例与分析
int num = 5;
if (num = 10) { // 应该是 == 而不是 =
printf("num等于10");
} else {
printf("num不等于10");
}
这段代码本意是判断num
是否等于10,但由于使用了单个等号,实际上是将num
的值设置为了10,然后这个赋值操作的返回值(即10,非零,表示真)作为条件判断,导致条件通过,打印出“num等于10”。
实际上这段代码在执行时,编译器会给出警告。
警告有两种级别,一种是warning,一种是error。程序员通常习惯于忽视warning,这是一个不好的习惯,特别是初级程序员。
那些编译器抛出的警告,不是无病呻吟,它们是在说:“嘿,我知道你可能知道你在做什么,但这个操作有点怪异,确定不是手滑吗?”
解决办法
务必使用双等号==
来进行比较操作。
if (num == 10) {
printf("num等于10");
} else {
printf("num不等于10");
}
4. while循环的无限循环
问题描述
由于循环条件设置不当,导致循环无法自然终止。
示例与分析
int i = 0;
while (i >= 0) {
printf("%d ", i++);
}
这里,因为i
始终大于等于0,循环将永远执行下去。
解决办法
确保循环有一个明确的退出条件。
int i = 0;
while (i < 10) { // 假设循环应执行10次
printf("%d ", i++);
}
5. for循环中的off-by-one错误
问题描述
在处理数组或序列时,因索引或计数错误导致少处理或重复处理元素。
示例与分析
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i <= 5; i++) {
printf("%d ", arr[i]);
}
这里,i <= 5
导致访问了数组越界的位置。
解决办法
确保循环范围正确,避免越界。
int arr[5] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}