【发布时间】:2015-06-01 12:15:51
【问题描述】:
我正在考虑在 do..while() 循环结束时执行多个 OR 条件,但我不确定我是否做得对。
我现在的情况如下:
do
{
(Insert code here)
}while(x != ('a' || 'e' || 'i' || 'o' || 'u');
这会起作用还是我应该用不同的方式编写它?
【问题讨论】:
标签: c do-while logical-operators logical-or
我正在考虑在 do..while() 循环结束时执行多个 OR 条件,但我不确定我是否做得对。
我现在的情况如下:
do
{
(Insert code here)
}while(x != ('a' || 'e' || 'i' || 'o' || 'u');
这会起作用还是我应该用不同的方式编写它?
【问题讨论】:
标签: c do-while logical-operators logical-or
作为其他答案中正确描述的显式单个测试的替代方法,您可能会发现使用strchr 更简洁/更具表现力:
do
{
...
} while (strchr("aeiou", x) == NULL);
【讨论】:
x 不在 -128..255 范围内,它可能会产生误报。但是如果x 是char 或者getc() 的返回值,这是一个可行且可读的解决方案。
x 是char,但你必须小心假设!
这不会做你想要的。你实际上想要:
do // note the lowercase d
{
(Insert code here)
}while(x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u');
您可以使用括号来明确优先级,例如while((x != 'a') && (x != 'e'))。
但是,如果您经常使用许多可能的字母进行这些检查,则应该查看(位)集,并检查 x 是否在该集中。 (编辑:或如 PaulR 建议的那样,strchr)
编辑:您最初编写的内容将做一些完全不同的事情。表达式
(x != ('a' || 'e' || 'i' || 'o' || 'u'))
首先计算!= 的两边,然后比较它们。左边是x,而右边其实是1。 || 是一个二元运算符,如果它的左侧或右侧是 !=0,则返回 1。所以它会看到'a'!=0,并停止评估其他人(因为它已经可以计算结果,它将优化它)。所以条件其实是while (x != 1)。
【讨论】:
'a' 是一个计算结果为非零的表达式。 (其实是小写字母a的ASCII值。)
所以'a' || 'b' 也是非零的,以此类推。事实上,表达式'a' || 'e' || 'i' || 'o' || 'u' 很可能在编译时求值:检查机器码。
如果您需要针对一组字符文字测试x 的值,那么您需要编写类似
x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u'
我个人倾向于构建一个函数isVowel,并将其用作您的while 条件。这有助于提高可扩展性。
【讨论】:
不,这是行不通的,因为在您的代码中,('a' || 'e' || 'i' || 'o' || 'u') 将首先被评估,它返回一个布尔值,并且它与 x 的比较没有任何意义。
我认为这就是你想要做的事情
do
{
// (Insert code here)
}while(x!='a' && x!='e' && x!='i' && x!='o' && x!='u');
【讨论】: