【问题标题】:How to format multiple OR condition?如何格式化多个 OR 条件?
【发布时间】: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


    【解决方案1】:

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

    do
    {
        ...
    } while (strchr("aeiou", x) == NULL);
    

    【讨论】:

    • 我喜欢这个,我想要一个简洁但不知道怎么做的。我以前没有使用过 strchr,但现在我明白了它的作用 :)
    • 此代码并非 100% 等效于相等测试:如果 x 不在 -128..255 范围内,它可能会产生误报。但是如果xchar 或者getc() 的返回值,这是一个可行且可读的解决方案。
    • @chqrlie:你说得对,我假设xchar,但你必须小心假设!
    【解决方案2】:

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

    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)

    【讨论】:

    【解决方案3】:

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

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

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

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

    我个人倾向于构建一个函数isVowel,并将其用作您的while 条件。这有助于提高可扩展性。

    【讨论】:

      【解决方案4】:

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

      我认为这就是你想要做的事情

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-01-30
        • 2016-07-26
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多