C++薪资计算程序输出重复打印、exit code -1报错排查
问题根因与修复方案
1. 链接错误collect2.exe: error: ld returned 1 exit status
该错误和代码逻辑无关,是文件锁导致的:之前运行的程序控制台窗口未正常关闭,对应exe文件被系统占用,编译器无法写入新的编译产物,实际运行的始终是旧版本的错误代码。
修复方法:关闭所有已打开的该程序控制台窗口,或在任务管理器中结束对应进程,再重新编译即可。
2. 输出重复打印、奖金计算错误
代码存在三处问题:
- 区间判断语法错误:C++不支持
a >= b < c形式的连续比较,该写法会先将a >= b的判断结果转为布尔值(true为1、false为0),再和c比较大小,判断逻辑完全失效。旧版本代码使用多个独立if而非else if结构时,会同时命中多个分支导致重复打印。 - 奖金比例错误:15000-49999.99美元区间要求7%涨幅,原代码中写为
0.7(即70%),计算结果偏差10倍。 - 冗余代码问题:每个分支重复编写总薪资计算、结果打印逻辑,容易引发重复执行、漏写等问题。
修复后完整代码
// Salary Calculator Program // Intro C++, Lesson 6 // Written by Phong Dau, Jun 2022 #include <iostream> using namespace std; int main( ) { // 声明变量 double oldSalary = 0.00; double bonus = 0.00; double total = 0.00; // 接收用户输入 cout << "Enter your old salary: "; cin >> oldSalary; // 按规则计算奖金 if (oldSalary < 15000.00) { bonus = oldSalary * 0.05; } else if (oldSalary >= 15000.00 && oldSalary < 50000.00) { bonus = oldSalary * 0.07; } else if (oldSalary >= 50000.00 && oldSalary < 100000.00) { bonus = oldSalary * 0.1; } else { bonus = oldSalary * 0.15; } // 统一计算总薪资并打印结果,无需在每个分支重复编写 total = bonus + oldSalary; cout << "You will receive a raise of $" << bonus << ", for a new yearly salary of $" << total << endl; system("pause"); return 0; }
验证说明
修复后各测试场景均符合预期:
- 输入10000:输出5%涨幅对应奖金500,总薪资10500,仅打印1次
- 输入20000:输出7%涨幅对应奖金1400,总薪资21400,仅打印1次
- 输入80000:输出10%涨幅对应奖金8000,总薪资88000,仅打印1次
- 输入150000:输出15%涨幅对应奖金22500,总薪资172500,仅打印1次
内容的提问来源于stack exchange,提问作者D A A U
相关产品推荐
相关产品推荐

