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

时间:2015-05-19 19:58:19

标签: c arrays ternary-operator lvalue

关于三元运营商。我使用更干净的三元运算符重写了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 | error:左值作为赋值的左操作数|

这是一个简单的代码来检查天气阵列中的位置是奇数还是偶数。 搜索和我读过的唯一与此代码相关的是左值是一个变量。如果这是真的,我将引用一个例子,直到今天我还没有得到答案:

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

占位符将由字面值27替换。此处不涉及变量,它很难实现。 谢谢。

4 个答案:

答案 0 :(得分:8)

变化:

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

到此:

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

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

根据评论中的建议,您可以获得相同的结果:

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

或简单地说:

arr[i] = i % 2;

答案 1 :(得分:4)

你可以简单地说:)

{{1}}

答案 2 :(得分:1)

由于运算符优先级问题,我相信您的代码会被解析为:(i % 2 == 0 ? arr[i] = 0 : arr[i]) = 1;。三元运算符生成rvalue,在C中无法分配。您应该将其更改为i % 2 == 0 ? (arr[i] = 0) : (arr[i] = 1);

无论如何,整个构造都是超级流行,最好用arr[i] = i % 2;

之类的东西替换

答案 3 :(得分:0)

为什么不:

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