C++代码输出不随efektywnosctypu变化且出现赋值用作真值警告
问题原因及修复方案
问题排查
你遇到的编译器提示suggest parentheses around assignment used as truth value已经直接指出了核心错误:
- C++中
=是赋值运算符,==才是相等判断运算符 - 你在所有if的判断条件中都误用了赋值运算符:
if(efektywnosctypu=1)的执行逻辑是先把efektywnosctypu的值强制改成1,再判断赋值后的值是否为非零(1永远为真),所以第一个if永远会触发,把attackfirst设为0,后续的if同样会强制修改efektywnosctypu的值,自然不会按照输入的参数返回不同结果。
另外还有两个隐藏问题:
attackfirst是int整数类型,乘以0.75/1.25这类浮点数后会自动截断取整,导致计算结果精度丢失attackfirst=attackfirst*=0.75的写法冗余,*=本身已经自带赋值效果,不需要外层再套一层赋值。
修复方案
- 把所有if判断中的
=替换为== - 将
attackfirst的类型修改为float避免整数截断 - 把独立的if改为
else if减少不必要的判断,简化赋值写法 - 可选:增加输入合法性校验,避免用户输入1-5之外的参数
修复后完整代码
#include <iostream> using namespace std; int main() { float attackfirst; // 改为浮点型保留小数计算结果 int zycieofiary; int tarczaofiary; int efektywnosctypu; cout << "Podaj atak atakujacego: "; cin >> attackfirst; cout << "Podaj tarcze: "; cin >> tarczaofiary; cout << "Podaj zycie ofiary: "; cin >> zycieofiary; cout << "Podaj efektywnosc typu: "; cin >> efektywnosctypu; tarczaofiary = tarczaofiary / 2; attackfirst = attackfirst - tarczaofiary; // 替换为==判断,改用else if if(efektywnosctypu == 1) { attackfirst = 0; } else if(efektywnosctypu == 2) { attackfirst *= 0.75; // 简化赋值写法 } else if(efektywnosctypu == 3) { // 不需要额外操作,保留原值即可 } else if(efektywnosctypu == 4) { attackfirst *= 1.25; } else if(efektywnosctypu == 5) { attackfirst *= 1.5; } else { // 可选:增加非法输入提示 cout << "Nieprawidlowa wartosc efektywnosci typu!" << endl; return 1; } zycieofiary = zycieofiary - attackfirst; cout << "Zycie ofiary to: "; cout << zycieofiary; return 0; }
内容的提问来源于stack exchange,提问作者DaXari YT
相关产品推荐
相关产品推荐

