我 % 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] = <ternary op expression>
可能更清楚。
@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 & 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;三元运算符错误的主要内容,如果未能解决你的问题,请参考以下文章