# 缘起
在 C 语言编程中,要将代码写的更高级一点,代码的逻辑更清晰,执行效率更高。在阅读 Autosar 的 EthSwt 模块时学到了一招。跟大家分分享一下!
在 C 语言中, do-while
循环是一种常见的循环结构,与 while
循环不同之处在于它先执行循环体,然后再判断条件是否成立。这使得 do-while
循环特别适用于需要至少执行一次循环体的情况。本文将介绍 do-while
循环的多种高级用法,包括菜单选择、输入验证、游戏循环和提前退出等。
# 菜单选择
do-while
循环经常被用于实现菜单选择功能。通过在循环体内展示菜单选项,要求用户输入选择,并根据用户输入执行相应操作,直到用户选择退出为止。以下是一个简单的菜单选择示例:
int choice; | |
do { | |
// 展示菜单 | |
printf("1. Option 1\n"); | |
printf("2. Option 2\n"); | |
printf("3. Quit\n"); | |
// 用户选择 | |
printf("Enter your choice: "); | |
scanf("%d", &choice); | |
// 根据选择执行相应操作 | |
switch (choice) { | |
case 1: | |
// 执行选项 1 对应的操作 | |
break; | |
case 2: | |
// 执行选项 2 对应的操作 | |
break; | |
case 3: | |
// 退出循环 | |
break; | |
default: | |
printf("Invalid choice, please try again.\n"); | |
} | |
} while (choice != 3); |
# 输入验证
利用 do-while
循环进行输入验证是另一个常见的用法。可以要求用户输入内容,并进行验证,直到输入符合要求为止。以下是一个输入正数的验证示例:
int number; | |
do { | |
printf("Enter a positive number: "); | |
scanf("%d", &number); | |
if (number <= 0) { | |
printf("Invalid input. Please try again.\n"); | |
} | |
} while (number <= 0); |
# 游戏循环
在游戏开发中, do-while
循环通常用于游戏主循环,确保游戏循环至少执行一次,并在每次迭代结束后检查退出条件。以下是一个简单的游戏循环示例:
char playAgain; | |
do { | |
// 游戏逻辑 | |
printf("Do you want to play again? (y/n): "); | |
scanf(" %c", &playAgain); | |
} while (playAgain == 'y'); |
# 提前退出
通过结合 do-while
循环和 continue
语句,我们可以在代码执行出错时提前跳出当前迭代,优化代码执行的效率。以下是一个示例,演示了在 do-while
循环中遇到错误时使用 continue
来提前结束当前迭代:
#include <stdio.h> | |
int main() { | |
int input; | |
do { | |
// 模拟需要输入并验证的操作 | |
printf("Enter a positive number: "); | |
if (scanf("%d", &input) != 1 || input <= 0) { | |
printf("Invalid input. Skipping to next iteration.\n"); | |
// 提前结束当前迭代 | |
continue; | |
} | |
// 条件二提前跳出 | |
if (input >= 10) { | |
printf("Invalid input. Skipping to next iteration.\n"); | |
// 提前结束当前迭代 | |
continue; | |
} | |
// 正确处理输入的情况 | |
printf("Input is valid: %d\n", input); | |
// 在这里可以继续添加其他需要执行的代码 | |
} while (input != -1); // 这里使用 -1 作为退出条件示例 | |
return 0; | |
} |
以上是 do-while
循环在 C 语言中多种用法的介绍,希望能帮助您更好地理解和应用这一循环结构。
# Autosar 代码示例
说一下提前退出啦
这里截取一段 Autosar 中的代码
/* 用宏定义来优化代码结构 */ | |
#define CHK_FUN_CONTINUE(r, f) \ | |
{ \ | |
(r) = (f); \ | |
if((int32)RT_ERR_OK != (int32)(r)) \ | |
{ \ | |
continue; \ | |
} \ | |
} | |
/* 可以使用 do {} while () 来优化代码执行效率 如果中间有一项执行失败就提前返回 */ | |
RtkApiRet rtk_mirror_disable(uint32 unit) | |
{ | |
RtkApiRet rtkRet = RT_ERR_OK; | |
do | |
{ | |
AUTOSAR_DEBUG_INFO("PORT_MIRRORING_DISABLED\n"); | |
/* Reset to the HW’s default values */ | |
CHK_FUN_CONTINUE(rtkRet, rtk_mirror_reset(unit, 1u)); | |
CHK_FUN_CONTINUE(rtkRet, reg_write(unit, TRAFFIC_MIRROR0_CONTROL2, 0x0)); | |
CHK_FUN_CONTINUE(rtkRet, reg_write(unit, MIRROR0_PORT_EGRESS_FILTER_CONTROL, 0x0)); | |
CHK_FUN_CONTINUE(rtkRet, reg_write(unit, TRAFFIC_MIRROR0_SAMPLE_CONTROL, 0x0)); | |
} while(0u == 1u); | |
return rtkRet; | |
} |
学会了嘛😜
谢谢可爱的你能看到最后呢!
爱你呀😍