C++简易二进制计数器输出异常:为何出现16亿级数值而非1?
问题分析与修复方案
核心错误:变量遮蔽
你的代码存在变量遮蔽问题——所有if块内以及循环末尾的int c1 = (c1 + 1);都重新声明了局部变量,这些局部变量会覆盖同名全局变量,导致你实际修改的是临时局部变量,而非全局的c1/c2/c3/c4:
- 比如
if (c1 == 1)块里的int c2 = 1;,创建的是局部c2,全局c2始终为0; - 循环末尾的
int c1 = (c1 + 1);中,局部c1未初始化,初始值是随机垃圾值,每次循环加1就出现了16亿级的异常数值。
修正后的代码
移除所有局部变量声明,直接修改全局变量,同时将if改为else if避免多条件触发逻辑错误:
#include <iostream> #include <cstdlib> using namespace std; int c1 = 0; int c2 = 0; int c3 = 0; int c4 = 0; int main () { for (int i = 15; i > -1; i--) { if ((c1 == 1) && (c2 == 1) && (c3 == 1)) { c4 = 1; c3 = 0; c2 = 0; c1 = 0; } else if ((c1 == 1) && (c2 == 1)) { c3 = 1; c2 = 0; c1 = 0; } else if (c1 == 1) { c2 = 1; c1 = 0; } c1++; system("clear"); cout << c1 << " " << c2 << " " << c3 << " " << c4 << endl; // 可选:添加延时看清变化,Linux用sleep(1),Windows用Sleep(1000) } }
额外优化说明
- 删除了未使用的
condition_variable cv;,减少冗余; - 替换
and为C++标准的&&运算符(and是兼容关键字,推荐用标准写法); - 用
i--替代i = i - 1,代码更简洁。
内容的提问来源于stack exchange,提问作者James Reeploeg
相关产品推荐
相关产品推荐

