if子句中的有条件分配

Conditional assignment in if clause

本文关键字:有条件 分配 子句 if      更新时间:2023-10-16

我有一个我不想重复太多的代码,看起来像这样:

myEnum setting;
if (((input == "Enum0") && ((setting = myEnum_0) == setting)) ||
    ((input == "Enum1") && ((setting = myEnum_1) == setting)) ||
    ((input == "Enum2") && ((setting = myEnum_2) == setting)))
{
    doActionWith(setting);
}

这样,我不必检查输入是否完全不同(如果我刚分配

if (input=="Enum0")
    setting = myEnum_0;

代码不知道枚举是否实际设置。

现在我想知道,最后有一个更优雅的解决方案吗?

&& ((setting = myEnum_x) == setting)

除了(setting = myEnum_0) == setting使用setting两次没有A 序列点的事实之外,您的代码很难理解。即使您修复了不确定的行为,例如(setting = myEnum_0) == myEnum_0,您的代码仍然是维护它的任何人的难题。

一种更好的方法是制作辅助功能,并在条件下使用三次:

if (tryParse(input, "Enum0", setting, Enum0)
||  tryParse(input, "Enum1", setting, Enum1)
||  tryParse(input, "Enum2", setting, Enum2)) {
}

tryParse定义为成功返回true,否则false否则。

我会选择:

//in the part of the code where you declare myEnum,
//if in a header, you might want to declare this inline
myEnum toMyEnum(const string input){
    if(input == "Enum0")
        return myEnum_0;
    ...
    return undefinedMyEnum;
}

然后您与

一起去
myEnum setting = toMyEnum(input);
if(setting != undefinedMyEnum){
    doActionWith(setting);
}

这样,您有明确的责任。您只需将字符串转换为枚举即可。您的副作用的代码很难读取,避免使用此类"技巧"。

编辑:第二个想法,现在我的代码产生了沉默错误,这很可能不是那么好。您可能需要用出口或投掷错误或明确的断言替换return undefinedMyEnum;

个性化,我会喜欢Aziuth建议的设计。但是,如果您想保持当前的设计,则可以这样做:

bool doStuff = true;
if (input=="Enum0")
    setting = myEnum_0;
else if (input=="Enum1")
    setting = myEnum_1;
else if (input=="Enum2")
    setting = myEnum_2;
else
{
    doStuff = false;
}
if (doStuff)
{
    doActionWith(setting);
}