【问题标题】:i % 2 == 0 ? arr[i] = 0 : arr[i] = 1; Ternary operator error我 % 2 == 0 ? arr[i] = 0 : arr[i] = 1;三元运算符错误
【发布时间】:2015-07-31 20:02:29
【问题描述】:

关于三元运算符。我正在使用更干净的三元运算符在 C 中重写 if-else 语句。 代码如下:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int arr[10];
    int i;

//    for ( i = 0; i < 10; i++ )
//    {
//        if ( i % 2 == 0 )
//        {
//            arr[i] = 0;
//        }
//
//        else arr[i] = 1;
//    }

    for ( i = 0; i < 10; i++ )
    {
         i % 2 == 0 ? arr[i] = 0 : arr[i] = 1;//Line in question
    }

    /* Just to check the result */
    for ( i = 0; i < 10; i++ )
    {
        printf ( "%d ", arr[i] );
    }

    return 0;
}

注释的代码确实有效,但令我惊讶的是,当我使用三元运算符编译文件时,我得到了以下信息:

C:\Users...\main.c|21|错误:需要左值作为赋值的左操作数|

这是一个简单的代码来检查数组中的位置是奇数还是偶数。 进行了搜索,我读到的唯一与此代码相关的是 lvalue 是一个变量。如果这是真的,我将举一个迄今为止我还没有得到答案的例子:

printf ( "%d", 23 + 4 );

占位符将被文字值 27 替换。这里不涉及任何变量,它很难工作。 谢谢。

【问题讨论】:

  • 三元运算符并不比 if-else“更干净”。您令人惊讶的错误证明了这一事实。
  • 至少在这种情况下,三元运算符并不比if/else 语句“更干净”。它只会使代码更难阅读(而且,正如您所见,语法不正确)。
  • 不要将三元运算符用作控制结构(即根据条件执行一个或多个语句);这不是它的意思。它会导致代码更难阅读,并且正如您所发现的,存在一些优先级问题。
  • 我认为大多数 C 程序员都会同意使用三元运算符 when 和 if/else 会做同样的事情,只是让代码更加晦涩难懂。如果它意味着不必重复同一表达式的其他部分,则在表达式中使用它会很有用。
  • @mxajd:请不要认真对待老师的建议,至少不要在这一点上。弄清楚如何在一行中编写复杂的代码可能很有趣,但结果难以阅读且难以维护。任何给定的代码块被读取的次数将比写入的次数多得多,并且也可能被多次修改。优化是为了清晰,而不是为了简洁。

标签: c arrays ternary-operator lvalue


【解决方案1】:

变化:

i % 2 == 0 ? arr[i] = 0 : arr[i] = 1;

到这里:

i % 2 == 0 ? (arr[i] = 0) : (arr[i] = 1);

条件运算符的优先级高于赋值运算符。

按照 cmets 的建议,您可以通过以下方式获得相同的结果:

arr[i] = (i % 2 == 0 ? 0 : 1);

或者简单地说:

arr[i] = i % 2;

【讨论】:

  • 或者,arr[i] = &lt;ternary op expression&gt; 可能更清楚。
  • @KeithThompson 是的,那个肯定赢了。
  • @ouah 你的解释对我来说不是很清楚:“条件运算符的优先级高于赋值运算符”。那是我的想法;首先评估条件,然后完成分配。尽管我同意用户的一些解决方案(比我的好得多),但我记得几年前,当我第一次看到三元运算符时,父母关系很重要。只是不要记住何时以及在这种情况下为什么。
  • @mxajd 这意味着像x ? y = a : y = b 这样的表达式被解析为(x ? (y = a) : y) = b 而不是(x ? (y = a) : y) = b
  • @mxajd “首先评估条件,然后完成分配。” – 您将评估顺序与优先级混淆了。
【解决方案2】:

你可以简单地:)

arr[i] = i%2;

【讨论】:

  • 或者更好的是 i &amp; 1 正确处理负值,这在原始示例代码中当然不是问题。
【解决方案3】:

由于运算符优先级问题,我相信您的代码会像这样解析:(i % 2 == 0 ? arr[i] = 0 : arr[i]) = 1;。三元运算符产生一个rvalue,在C 中,它不能被赋值。你应该把它改成i % 2 == 0 ? (arr[i] = 0) : (arr[i] = 1);

无论如何,这整个结构都是多余的,最好用arr[i] = i % 2;之类的东西代替

【讨论】:

    【解决方案4】:

    为什么不:

    for (i=0; i < 10; i+=2)  {
        arr[i]   = 0;
        arr[i+1] = 1;
    }
    

    【讨论】:

    • 挑战是在一行中完成所有操作
    猜你喜欢
    • 2010-11-18
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多