我正在考虑在do..while()
循环结束时执行多个 OR 条件,但我不确定我是否做得对。
我现在拥有的如下:
do
{
(Insert code here)
}while(x != ('a' || 'e' || 'i' || 'o' || 'u');
这会起作用还是我应该用不同的方式写?
我正在考虑在do..while()
循环结束时执行多个 OR 条件,但我不确定我是否做得对。
我现在拥有的如下:
do
{
(Insert code here)
}while(x != ('a' || 'e' || 'i' || 'o' || 'u');
这会起作用还是我应该用不同的方式写?
作为其他答案中正确描述的显式单个测试的替代方法,您可能会发现使用strchr更简洁/更具表现力:
do
{
...
} while (strchr("aeiou", x) == NULL);
那不会做你想做的事。你实际上想要:
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)
。
'a'
是一个计算结果为非零的表达式。(实际上是小写字母的 ASCII 值a
。)
所以'a' || 'b'
也是非零的,依此类推。事实上,表达式'a' || 'e' || 'i' || 'o' || 'u'
可能是在编译时评估的:检查机器代码。
如果您需要x
针对一组字符文字测试 的值,那么您需要编写类似的内容
x != 'a' && x != 'e' && x != 'i' && x != 'o' && x != 'u'
就个人而言,我倾向于构建一个 function isVowel
,并将其用作您的while
条件。这可能有助于可扩展性。
不,这不起作用,因为在您的代码中,('a' || 'e' || 'i' || 'o' || 'u')
将首先评估返回布尔值,并且与它的比较x
没有任何意义。
我认为这就是你想要做的
do
{
// (Insert code here)
}while(x!='a' && x!='e' && x!='i' && x!='o' && x!='u');