0

我正在考虑在do..while()循环结束时执行多个 OR 条件,但我不确定我是否做得对。

我现在拥有的如下:

do
{
    (Insert code here)
}while(x != ('a' || 'e' || 'i' || 'o' || 'u');

这会起作用还是我应该用不同的方式写?

4

4 回答 4

8

作为其他答案中正确描述的显式单个测试的替代方法,您可能会发现使用strchr更简洁/更具表现力:

do
{
    ...
} while (strchr("aeiou", x) == NULL);
于 2015-06-01T12:20:21.543 回答
5

那不会做你想做的事。你实际上想要:

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||是二元运算符,1如果它的左侧或右侧是!=0,则返回它。所以它会看到'a'!=0,并停止评估其他人(因为它已经可以计算结果,它会优化它)。所以条件其实是while (x != 1)

于 2015-06-01T12:17:10.550 回答
2

'a'是一个计算结果为非零的表达式。(实际上是小写字母的 ASCII 值a。)

所以'a' || 'b'也是非零的,依此类推。事实上,表达式'a' || 'e' || 'i' || 'o' || 'u'可能是在编译时评估的:检查机器代码。

如果您需要x针对一组字符文字测试 的值,那么您需要编写类似的内容

x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u'

就个人而言,我倾向于构建一个 function isVowel,并将其用作您的while条件。这可能有助于可扩展性。

于 2015-06-01T12:19:50.067 回答
1

不,这不起作用,因为在您的代码中,('a' || 'e' || 'i' || 'o' || 'u')将首先评估返回布尔值,并且与它的比较x没有任何意义。

我认为这就是你想要做的

do
{
// (Insert code here)
}while(x!='a' && x!='e' && x!='i' && x!='o' && x!='u');
于 2015-06-01T12:24:07.570 回答