C++中do...while(0)的妙用

一 点睛

do{...}while(condition)可以表示循环,但你有没有遇到在一些地方宏定义中可以不用循环的地方,也用到了do{...}while(condition),比如有这样的宏:

#define Foo(x) do{\
    printf("first statement\n");\
    printf("second statement\n");\
}while(0) 

粗看会觉得很奇怪,既然循环里面执行了一次,那这个看似多余的do...while(0)有什么意义呢?再看下面这个宏

#define Foo(x) {\
    printf("first statement\n");\
    printf("second statement\n");\
}

这两个看似一样的宏,其实是不一样的。前者定义的宏是一个非复合的语句,而后面却是一个复合语句。假设有下面这个使用场景:

if(true)
    Foo(x);
else
{}

因为宏在预处理的时候会直接展开,采用第2种写法,会变成下面这样:

if(true)
    printf("first statement\n");
    printf("second statement\n");
else
{}

这样会导致else语句孤立而出错。加了do{...}while(condition),就使得宏展开后,仍然保留初始的语义,从而保证程序的正常性。

二 实战

1 正确使用方法

1.1 代码

### C++ 中 `do...while` 循环的练习题与示例代码 以下是几个基于 `do...while` 的典型编程题目及其解决方案: #### 题目一:验证密码输入 编写一个程序,提示用户输入密码直到匹配为止。 ```cpp #include <iostream> using namespace std; int main() { string password = "secret"; string input; do { cout << "请输入密码: "; cin >> input; } while (input != password); cout << "密码正确!" << endl; return 0; } ``` 此代码通过 `do...while` 实现了至少一次的密码验证逻辑[^5]。 --- #### 题目二:累加器功能 创建一个程序,让用户不断输入数字并求和,当用户输入负数时停止操作。 ```cpp #include <iostream> using namespace std; int main() { int number, sum = 0; do { cout << "请输入一个正整数(输入负数结束): "; cin >> number; if (number >= 0) { sum += number; } } while (number >= 0); cout << "总和为: " << sum << endl; return 0; } ``` 上述实现展示了如何使用 `do...while` 来持续接收用户输入直至特定条件满足。 --- #### 题目三:菜单驱动的应用程序 设计一个小应用,提供选项供用户选择执行不同任务,只有当用户选择退出时才终止运行。 ```cpp #include <iostream> using namespace std; void taskOne() { cout << "执行任务1." << endl; } void taskTwo() { cout << "执行任务2." << endl; } int main() { int choice; do { cout << "\n请选择一项:\n" << "1. 执行任务1\n" << "2. 执行任务2\n" << "0. 退出\n" << "您的选择: "; cin >> choice; switch(choice) { case 1: taskOne(); break; case 2: taskTwo(); break; case 0: cout << "退出程序."; break; default: cout << "无效的选择!"; break; } } while (choice != 0); return 0; } ``` 这段代码体现了 `do...while` 在构建交互式界面中的作用。 --- #### 题目四:猜数字游戏 开发一款小游戏,随机生成一个介于 1 到 100 的整数,玩家需猜测该数值。如果错误,则给出提示继续尝试;一旦成功则显示祝贺消息。 ```cpp #include <iostream> #include <cstdlib> // rand(), srand() #include <ctime> // time() using namespace std; int main() { srand(time(0)); // 初始化随机种子 int target = rand() % 100 + 1; // 范围 [1, 100] int guess; do { cout << "猜一个数字 (1-100): "; cin >> guess; if (guess < target) { cout << "太低了!\n"; } else if (guess > target) { cout << "太高了!\n"; } } while (guess != target); cout << "恭喜你! 正确答案就是 " << target << "." << endl; return 0; } ``` 该游戏充分利用了 `do...while` 结构来确保至少有一次机会让玩家参与。 --- #### 题目五:统计字符数量 请求用户提供任意字符串,并逐一遍历其中每一个字母计数,最后展示总数。 ```cpp #include <iostream> using namespace std; int main() { char ch; int count = 0; cout << "请输入一些文字(按Ctrl+D结束):" << endl; do { cin.get(ch); // 获取单个字符包括空白符 if (!cin.eof()) { // 如果未到达文件结尾标志EOF ++count; } } while (!cin.eof()); cout << "您总共输入了 " << count << " 个字符。\n"; return 0; } ``` 这里运用了 `do...while` 处理流读取场景下的循环控制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值