更好的子分支设计if语句子条件

时间:2017-02-18 19:23:14

标签: c coding-style

我正在尝试重构具有多个子条件的if语句。根据我目前的尝试,我要么必须两次写入条件,要么两次写入预期的结束函数。我想要一种更清洁的方式。

这是我写的初始代码:

   if((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= 'a' && s[i] <= 'z')){ // cipher uppercase letters
        bool uppercase = true;
        if (s[i] >= 'a' && s[i] <= 'z') { // cipher lowercase letters
            bool uppercase = false;
        }
        printf("%c", cipher_letter(s[i], true, k));
    }
    else { // do nothing on non-alphabet letters
        printf("%c", s[i]);
    }

我现在找到的清洁方式是:

if(s[i] >= 'A' && s[i] <= 'Z') { // cipher uppercase letters
    printf("%c", cipher_letter(s[i], true, k));
}
else if (s[i] >= 'a' && s[i] <= 'z') { // cipher lowercase letters
    printf("%c", cipher_letter(s[i], false, k));
}
else { // do nothing on non-alphabet letters
    printf("%c", s[i]);
}

但是我必须重复cipher_letter函数。

什么是更好的造型方式?

2 个答案:

答案 0 :(得分:4)

要回答有关条件的问题,请引入两个局部变量来缓存测试的两个部分的结果。

bool isUpper = s[i] >= 'A' && s[i] <= 'Z';
bool isLower = s[i] >= 'a' && s[i] <= 'z';

if (isUpper || isLower) {
    printf("%c", cipher_letter(s[i], isUpper, k));
}
else { // do nothing on non-alphabet letters
    printf("%c", s[i]);
}

其他名称还增加了测试目的的清晰度,有助于理解其他人稍后阅读代码(可能包括您)。

已更新:我已将错误的布尔传递给cipher_letter;谢谢你的收获。

答案 1 :(得分:1)

为了更好的设计,它可以简化为:

if (isalpha(s[i]))
    putchar(cipher_letter(s[i], isupper(s[i]), k));
else
    putchar(s[i]);

甚至:

putchar(isalpha(s[i]) ? cipher_letter(s[i], isupper(s[i]), k) : s[i]);

我更喜欢前者,因为它看起来更清晰。

在效率方面,isalphaisupper调用都可能通过宏来实现,这些宏引用lookup table数组,例如__ctype_b_loc(GCC,Clang)