llvalue需要作为赋值的左操作数

时间:2013-03-15 16:16:17

标签: c

我不想在追加模式下打开文件或根据$ flag删除所有内容

static void do_redirect(int filedes, const char *filename, int flag){
int rc;
int fd;

flag == 1 ? fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, 0644) : 
            fd = open(filename, O_CREAT| O_RDWR, 0644);

}

为什么我需要将llvalue作为赋值的左操作数?

3 个答案:

答案 0 :(得分:3)

由于优先权。表达式是隐式括号

(flag == 1 ? fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, 0644) : fd) = open(filename, O_CREAT| O_RDWR, 0644);

并且条件表达式的值不是左值。

flag == 1 ? (fd = open(filename, O_CREAT|O_RDWR|O_TRUNC, 0644)) : 
            (fd = open(filename, O_CREAT| O_RDWR, 0644));

或在open调用中移动条件表达式。

答案 1 :(得分:2)

这是一个优先权问题。

我建议你这样重写:

fd = open(filename, O_CREATE | O_RDWR | (flag == 1 ? O_TRUNC : 0), 0644);

答案 2 :(得分:1)

  

为什么会出现左值误差?

您的条件表达式类似于:

flag == 1 ? fp = 1 : fp = 2; 

在C中解析,如:

(flag == 1 ? fp = 1 : fp) = 2;  

  ^ expression            = value   

并且您无法为表达式赋值,因为左值错误的原因。

@Daniel Fischer给出了正确的答案,通过添加括号,您可以纠正条件表达式(实际上覆盖优先级)。

但有趣的是,你的表达方式在C ++语言中是正确的! 阅读Charles Bailey的回答:Conditional operator differences between C and C++。你也会找到一个精心解答的答案,为什么你会得到左值误差 (我的回答只是对的引用)

虽然@Daniel Fischer和@Joachim Pileborg回答了你的两个伎俩,你也可以这样做:

fd = flag == 1 ? -2 : 3 ;

是的,但这只适用于您的情况,因为您在真/假表达中使用fd