我 % 2 == 0 ? arr[i] = 0 : arr[i] = 1;三元运算符错误

Posted

技术标签:

【中文标题】我 % 2 == 0 ? arr[i] = 0 : arr[i] = 1;三元运算符错误【英文标题】:i % 2 == 0 ? arr[i] = 0 : arr[i] = 1; Ternary operator error 【发布时间】: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:请不要认真对待老师的建议,至少不要在这一点上。弄清楚如何在一行中编写复杂的代码可能很有趣,但结果难以阅读且难以维护。任何给定的代码块被读取的次数将比写入的次数多得多,并且也可能被多次修改。优化是为了清晰,而不是为了简洁。 【参考方案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;

【讨论】:

挑战是在一行中完成所有操作

以上是关于我 % 2 == 0 ? arr[i] = 0 : arr[i] = 1;三元运算符错误的主要内容,如果未能解决你的问题,请参考以下文章

多维数组与交错数组的转换

堆排序

堆排序

局部最小值位置

闭包实例

11.20 作业