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

C 更好地设计子分支if语句子条件,c,coding-style,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]

我正在尝试重构包含多个子条件的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]);
}
但是我必须重复密码字母函数


有什么更好的方式来设置这种情况?

要回答您关于这种情况的问题,请引入两个局部变量来缓存测试两部分的结果

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]);
}
额外的名字也增加了测试目的的清晰性,有助于其他阅读代码的人理解可能包括您在内的其他人


更新:我传递了错误的密码字母;感谢您的关注。

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

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]);
}
额外的名字也增加了测试目的的清晰性,有助于其他阅读代码的人理解可能包括您在内的其他人


更新:我传递了错误的密码字母;感谢您的帮助。

为了更好地设计,可以将其简化为:

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]);
我更喜欢前者,因为它看起来更清晰


为了提高效率,和调用都可能通过宏实现,宏引用数组,如uu ctype_b_loc GCC,Clang。

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

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]);
我更喜欢前者,因为它看起来更清晰


为了提高效率,and调用可能都是通过宏实现的,宏引用数组,例如uu ctype_b_loc GCC,Clang。

您到底想做什么?可能不是优化你的解决方案,而是找到一个全新的解决方案。我完全赞成。代码是有效的,我只是在寻找更好的样式,或者正如您所说的,总体上是一个更好的解决方案。第二个版本应该说明我在做什么。如果有人问他们的解决方案是否正确,原则上我不相信他们的解决方案。我不知道你的解决方案是否正确。因此,我希望您先陈述您的问题,然后展示一个实现。不管怎样,你的问题看起来更适合我。我理解你提出的问题,我会在下一个问题上这样做。仍然想说我的代码是有效的,我只是在寻找更好的风格,因为我以前多次遇到过这个问题。请注意,isalpha、islower和isupper都提供了include以方便您。您到底想做什么?可能不是优化你的解决方案,而是找到一个全新的解决方案。我完全赞成。代码是有效的,我只是在寻找更好的样式,或者正如您所说的,总体上是一个更好的解决方案。第二个版本应该说明我在做什么。如果有人问他们的解决方案是否正确,原则上我不相信他们的解决方案。我不知道你的解决方案是否正确。因此,我希望您先陈述您的问题,然后展示一个实现。不管怎样,你的问题看起来更适合我。我理解你提出的问题,我会在下一个问题上这样做。仍然想说我的代码是有效的,我只是在寻找更好的风格,因为我以前多次遇到过这个问题。请注意,isalpha、islower和isupper都提供了include以方便您使用。太好了,这正是我想要的重构。每次这个问题再次出现都会给我很大帮助。太好了,这正是我想要的重构。每当这个问题再次出现时,我会帮上很大的忙。