C中有多个if语句

idn*_*now 2 c if-statement statements

假设我想在考虑到他工作的年数和他拥有的孩子数量后计算员工的net_salary.我不想使用嵌套的if语句,因为这会使我需要进行的检查数量变得复杂.

double base_salary, net_salary;
int nmbr_kids, nmbr_years;

if(nmbr_kids >= 1 && nmbr_kids <3){
    net_salary = base_salary + 200;
}
else if(nmbr_kids >= 3 && nmbr_kids <4){
    net_salary = base_salary + 400;
}
else if (nmbr_kids >= 4){
    net_salary = base_salary + 600;
}
else{
net_salary = base_salary;
}
/* now I want to account for the number of years worked by the employee and update accordingly his net_salary */

if(nmbr_years >= 1 && nmbr_years <3){
    net_salary = net_salary + 200;
}
else if(nmbr_years >= 3 && nmbr_years <4){
    net_salary = net_salary +400;
}
else if(nmbr_years >= 4){
    net_salary = net_salary + 600;
}
else{
net_salary = net_salary;
}
Run Code Online (Sandbox Code Playgroud)

有更好,更紧凑的方式来做上述事情吗?或者我是以错误的方式看问题的?

Jon*_*ler 5

第一个序列可以更改为:

if (nmbr_kids == 0)
    net_salary = base_salary +   0;
else if (nmbr_kids < 3)
    net_salary = base_salary + 200;
else if (nmbr_kids < 4)
    net_salary = base_salary + 400;
else 
    net_salary = base_salary + 600;
Run Code Online (Sandbox Code Playgroud)

这里的关键思想是消除条件.原件必须检查范围的两端,因为0个孩子的情况没有先处理.

或者,您可以定义一个数组:

double kids_bonus[] = { 0, 200, 200, 400, 600, 600, 600, 600 };
enum { NUM_KIDS_BONUS_VALUES = sizeof(kids_bonus) / sizeof(kids_bonus[0]) };

int eff_kids = nmbr_kids;
if (eff_kids >= NUM_KIDS_BONUS_VALUES)
    eff_kids = NUM_KIDS_BONUS_VALUES - 1;
net_salary = base_salary + kids_bonus[eff_kids];
Run Code Online (Sandbox Code Playgroud)

或者,有一个min功能:

static inline int min(int x, int y) { return (x < y) ? x : y; }

int eff_kids = min(nmbr_kids, NUM_KIDS_BONUS_VALUES - 1);
net_salary = base_salary + kids_bonus[eff_kids];
Run Code Online (Sandbox Code Playgroud)

当然,如果你有一个孩子数量的上限,你可以简单地创建一个足够大的数组.

当然,你的原始状况else if (nmbr_kids >= 3 && nmbr_kids < 4)会更好else if (nmbr_kids == 3).

在第二种情况下也可以使用相同的策略.