一、关于If语句的小知识
1. 条件何为真,何为假?
在C语言中,条件表达式的真假取决于其结果是否为真值(true)或假值(false)。通常情况下,条件表达式的结果为真值时,表示条件为真;结果为假值时,表示条件为假。
具体来说,C语言中将条件表达式的结果为0视为假(false),非零值视为真(true)。这是由C语言的逻辑运算规则决定的。
下面举一个例子:
#include <stdio.h>
int main() {
int x = 5;
if (x == 0) {
printf("x is equal to 0\n");
} else {
printf("x is not equal to 0\n");
}
return 0;
}
运行结果
x is not equal to 0
在这个例子中,变量x的值为5,所以条件表达式x == 0
的结果为假(false)。因为5不等于0,所以条件表达式的结果为0,即假值。因此,程序将执行else语句块中的代码,并输出"x is not equal to 0"。
2. if语句执行流程?else语句可以写多个吗?
if语句的执行流程可概括如下:
(1)首先,计算if后的条件表达式的值。
(2)如果条件表达式的值为真(非零),则执行if语句块中的代码。
(3)如果条件表达式的值为假(0),则跳过if语句块,继续执行后续代码。
(4)如果存在else语句,则当if条件为假时执行else语句块中的代码。
需要注意的是,else语句只能与一个if语句对应,不能直接写多个else语句。这是因为else语句始终与最近的未匹配的if语句配对。如果需要实现多个条件分支,可以使用嵌套的if-else结构,或者使用switch语句。
举个例子:
#include <stdio.h>
int main() {
int x = 10;
if (x < 5) {
printf("x is less than 5\n");
} else if (x < 10) {
printf("x is between 5 and 9\n");
} else {
printf("x is 10 or greater\n");
}
return 0;
}
运行结果
x is 10 or greater
在这个例子中,根据变量x的值,程序将会输出相应的消息,这里使用了一个if-else if-else结构来实现多个条件分支。
3. 分支包含多条语句可以不写花括号{}吗?
在C语言中,如果分支包含多条语句,可以选择是否使用花括号{}来包裹这些语句。不写花括号的话,只有紧接在if或else后的第一条语句会被条件控制。这种情况下,建议始终使用花括号,以提高代码的可读性和可维护性。
下面是一个例子:
if (x > 0)
printf("x is positive\n");
printf("This line is always executed\n");
当x > 0时,运行结果:
x is positive
This line is always executed
当x < 0时,运行结果:
This line is always executed
在这个例子中,第二条printf语句是在条件控制之外,无论x为何值,总是会被执行。如果希望它们都受条件控制,应该使用花括号包裹起来。
4. if的嵌套使用?
在C语言中,可以在if语句中嵌套使用其他的if语句,形成多层的条件判断。这种嵌套可以让程序根据不同的条件执行不同的代码块。例如:
if (x > 0) {
if (y > 0) {
printf("x and y are both positive\n");
} else {
printf("x is positive but y is not\n");
}
} else {
printf("x is not positive\n");
}
5. 悬空else问题——就近原则!
在C语言中,悬空else问题指的是else与最近的未匹配的if语句相匹配的情况。这意味着else语句可能会与不正确的if语句配对,导致程序逻辑出现错误。为了避免悬空else问题,应该使用花括号明确指定if和else的作用范围。
举个例子:
if (x > 0)
if (y > 0)
printf("Both x and y are positive\n");
else
printf("x is not positive\n");
运行结果:
x = 1 y = 2
Both x and y are positive
x = 1 y = -1
x is not positive
x = -1 y = 2
x is not positive
显然,输出结果取决于x和y的值。
在这个例子中,else语句与最近的未匹配的if语句相匹配,即与if (y > 0)
相匹配,而不是与if (x > 0)
相匹配。这意味着无论x的值如何,else语句都会执行。这与代码的预期行为不符。
因此为达到预期效果,使用花括号明确指定if和else的作用范围,如下所示:
if (x > 0) {
if (y > 0) {
printf("Both x and y are positive\n");
}
} else {
printf("x is not positive\n");
}
运行结果:
x = 1
y = 2Both x and y are positive
x = 1
y = -1x is not positive
x = -1
y = 2x is not positive
二、关于Switch语句的小知识
当我们在C语言中使用switch
语句时,我们通常用它来替代一系列的if-else
语句。
1. if-else如何改写为switch语句?
if-else
语句可以通过switch
语句来改写,前提是if-else
的条件是可以被转换为整数或字符类型。例如:
// 使用if-else语句
if (x == 1) {
printf("One\n");
} else if (x == 2) {
printf("Two\n");
} else if (x == 3) {
printf("Three\n");
} else {
printf("Other\n");
}
上述代码可以改写为:
// 使用switch语句
switch (x) {
case 1:
printf("One\n");
break;
case 2:
printf("Two\n");
break;
case 3:
printf("Three\n");
break;
default:
printf("Other\n");
break;
}
2. switch后的表达式类型是什么?
switch
后的表达式可以是整数类型或字符类型,即任何可以用于判断的整数或字符。它可以是int
、char
、short
等整数类型,或是字符类型。
注意,不能是浮点型 float
、double
。
3. case后面值的类型是什么?(注意case和值之间一定要有空格)
case
后面的值必须是常量表达式,可以是整数常量、字符常量或枚举常量。注意,case
和值之间必须有空格。例如:
switch (x) {
case 1:
// do something
break;
case 'A':
// do something else
break;
default:
// default case
break;
}
在这个例子中,case 1
中的值是整数常量,case 'A'
中的值是字符常量。
4. default?switch的运行顺序是什么?
default
是可选的,用于处理switch
表达式中没有任何一个case
匹配的情况。当switch
中的表达式的值与某个case
的值匹配时,程序将会执行该case
下的语句,然后跳出switch
语句。如果没有一个case
匹配成功,则会执行default
语句(如果有的话),然后跳出switch
语句。default
并不是必须的,如果没有default
,那么当没有匹配的case
时,程序将直接跳出switch
语句。
switch
语句的运行顺序是从上至下逐个检查case
是否匹配,直到找到匹配的case
或者到达default
或switch
语句的结尾。
一个简单的例子:
switch (x) {
case 1:
printf("One\n");
break;
case 2:
printf("Two\n");
break;
default:
printf("Other\n");
break;
}
switch (x) {
default:
printf("Other\n");
break;
case 1:
printf("One\n");
break;
case 2:
printf("Two\n");
break;
}
假设x
的值是2,两者运行结果都为:
Two
三、总结
1. if语句与switch语句的用法
-
if语句:
- 用于根据条件执行不同的代码块。
- 能够处理单条件判断、多条件判断以及嵌套条件判断等情况。
- 语法结构灵活,适用于各种条件判断场景。
-
switch语句:
- 用于根据表达式的值匹配不同的case值,执行对应的代码块。
- 更适用于多个值匹配同一种处理逻辑的场景。
- 代码结构清晰,易于理解和维护。
2. if语句与switch语句的语法结构
-
if语句:
if (条件表达式) { // 如果条件为真,执行这里的代码块 } else { // 如果条件为假,执行这里的代码块 }
-
switch语句:
switch (表达式) { case 值1: // 如果表达式的值等于值1,执行这里的代码块 break; case 值2: // 如果表达式的值等于值2,执行这里的代码块 break; // 更多的case语句 default: // 如果表达式的值都不匹配上面的任何一个值,执行这里的代码块 break; }
3. if语句与switch语句的使用场景
-
if语句:
- 适用于各种条件判断场景,包括单条件判断、多条件判断以及嵌套条件判断等。
- 当条件较为复杂或灵活变化时,if语句更为灵活。
-
switch语句:
- 适用于多个值匹配同一种处理逻辑的场景,简化多条件判断的代码逻辑。
- 当条件为表达式的值匹配不同case值时,使用switch更为直观。
因此
- if语句和switch语句都是用于条件判断的控制流程语句,各自适用于不同的场景。
- 在简单的条件判断场景下,if语句更加灵活;在多个值匹配同一种处理逻辑的场景下,switch语句更加简洁。
- 根据具体情况选择合适的条件判断方式,以提高代码的可读性和可维护性。