# 缘起

在 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;
}

学会了嘛😜

谢谢可爱的你能看到最后呢!

爱你呀😍

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

flechazo 微信支付

微信支付

flechazo 支付宝

支付宝

flechazo 贝宝

贝宝