我正在考虑在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');