C语言中的决策与控制结构
立即解锁
发布时间: 2025-08-20 01:16:47 阅读量: 1 订阅数: 4 


Arduino C语言编程入门与实践
# C语言中的决策与控制结构
## 1. 优化代码逻辑
在编程中,我们常常会遇到需要根据不同条件执行不同操作的情况。以控制LED灯闪烁的代码为例,最初的代码可能会有一些冗余,我们可以通过优化来提高代码的效率和可读性。
### 1.1 简化代码示例
最初的代码可能是这样的:
```c
delay(1000); // wait for a second
counter = counter + 1;
```
我们可以使用`if-else`语句来简化代码,减少`delay()`函数的调用次数。同时,定义两个新的变量`led1`和`led2`,让代码更加清晰:
```c
void loop() {
if (counter % 2 == 1) {
led1 = 11; // LED on pin 11 will be lit
led2 = 10; // LED on pin 10 will go out
} else {
led1 = 10; // LED on pin 10 will be lit
led2 = 11; // LED on pin 11 will go out
}
digitalWrite(led1, HIGH); // turn LED on (HIGH)
digitalWrite(led2, LOW); // turn LED off (LOW)
delay(1000); // wait for a second
counter = counter + 1;
}
```
### 1.2 代码优化的启示
从这个例子中,我们可以学到以下几点:
- 简单的`if`测试可以让程序正常运行,但`if-else`语句通常更高效,因为它可以减少`if`测试表达式的数量。
- `if-else`语句可以重新组织,使代码更易于阅读和理解。
- 实现一个功能往往有多种方式,程序能运行并不意味着代码是最有效的。在处理内存有限的情况时,对代码的微小调整可能会影响程序的运行。
## 2. 级联`if`语句
当程序需要根据变量的特定值执行特定操作时,我们可能会使用一系列的`if`语句。但这种方式可能会导致代码效率低下。
### 2.1 级联`if`语句示例
```c
int myDay;
// Some code that determines what day it is...
if (myDay == 1) {
doSundayStuff();
}
if (myDay == 2) {
doMondayStuff();
}
if (myDay == 3) {
doTuesdayStuff();
}
if (myDay == 4) {
doWednesdayStuff();
}
if (myDay == 5) {
doThursdayStuff();
}
if (myDay == 6) {
doFridayStuff();
}
if (myDay == 7) {
doSaturdayStuff();
}
```
这种代码存在问题,因为即使第一个`if`测试为真,程序仍然会执行后续的`if`测试,这是不必要的。
### 2.2 优化级联`if`语句
我们可以使用嵌套的`if`语句来优化这个问题,形成级联`if`语句:
```c
if (myDay == 1) {
doSundayStuff();
} else {
if (myDay == 2) {
doMondayStuff();
} else {
if (myDay == 3) {
doTuesdayStuff();
} else {
// you get the idea...
}
}
}
```
当`myDay`等于1时,`doSundayStuff()`被调用,后续的`if`测试将被跳过。这种方式提高了代码的效率,但级联`if`语句也有一些缺点,比如代码过长时可能需要水平滚动窗口查看,而且最后一个条件的测试仍然需要执行多次。
## 3. 自增和自减运算符
在编程中,对变量进行自增或自减操作是非常常见的。C语言提供了专门的运算符来实现这些操作。
### 3.1 自增运算符
自增运算符有两种形式:前置自增和后置自增。
- 前置自增:`++counter;`,先将变量的值加1,然后再使用该变量的值。
- 后置自增:`counter++;`,先使用变量的值,然后再将变量的值加1。
以下是一个示例代码:
```c
int c = 5;
int k;
k = ++c; // pre-increment
```
在这个例子中,`k`的值为6,因为前置自增运算符先将`c`的值加1,然后再将新的值赋给`k`。
如果使用后置自增运算符:
```c
k = c++; // post-increment
```
此时`k`的值为5,因为后置自增运算符先使用`c`的值赋给`k`,然后再将`c`的值加1。
### 3.2 自减运算符
自减运算符也有前置和后置两种形式,原理与自增运算符类似。
- 前置自减:`--counter;`
- 后置自减:`counter--;`
例如:
```c
int c = 6;
int k;
k = --c; // pre-decrement
```
此时`k`和`c`的值都为5,因为前置自减运算符先将`c`的值减1,然后再将新的值赋给`k`。
如果使用后置自减运算符:
```c
k = c--; // post-decrement
```
`k`的值为6,`c`的值为5,因为后置自减运算符先使用`c`的值赋给`k`,然后再将`c`的值减1。
### 3.3 运算符使用注意事项
当自增和自减运算符单独使用时,前置和后置形式的效果是一样的。但当它们作为较大表达式的一部分时,需要注意运算符的使用顺序。
## 4. 运算符优先级
随着我们引入了更多的运算符,我们需要了解它们的优先级。以下是C语言中运算符的优先级表:
| 级别 | 运算符 |
| ---- | ---- |
| 1 | `()` `[]` `→` `.` (dot) |
| 2 | `!` `~` `++` `--` `+` (unary) `-` (unary) `*` (indirection) `&` (address of) `(cast)` `sizeof` |
| 3 | `*` (multiplication) `/` `%` |
| 4 | `+` (binary) `-` (binary) |
| 5 | `<<` `>>` |
| 6 | `<` `<=` `>` `>=` |
| 7 | `==` `!=` |
| 8 | `&` (bitwise AND) |
| 9 | `^` |
| 10 | `|` |
| 11 | `&&` |
| 12 | `||` |
| 13 | `?:` |
| 14 | `=` `+=` `-=` `*=` `/=` `%=` `&=` `^=` `|=` `<<=` `>>=` |
| 15 | `,` (comma) |
这个优先级表需要我们记忆,建议将其所在的页码写在书的封底内页,方便在编写程序时参考。
## 5. `switch`语句
`switch`语句是另一种控制程序流程的方式,它可以根据表达式的值跳转到相应的代码块。
### 5.1 `switch`语句的语法
```c
switch (expression1) { // opening brace for switch statement block
case 1:
// statements to execute when expression1 is 1
break;
case 2:
// statements to execute when expression1 is 2
break;
case 3:
// statements to execute when expression1 is 3
break;
// more case statements as needed
default:
// execute if expression1 doesn't have a "case value"
break;
} // closing brace for switch statement block
// All br
```
0
0
复制全文
相关推荐










