1

我不想以附加模式打开文件或基于 $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 作为赋值的左操作数?

4

3 回答 3

2

因为优先。表达式被隐式括起来

(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调用中移动条件表达式。

于 2013-03-15T16:18:34.483 回答
2

这是一个优先级的问题。

我建议你这样重写它:

fd = open(filename, O_CREATE | O_RDWR | (flag == 1 ? O_TRUNC : 0), 0644);
于 2013-03-15T16:18:38.317 回答
1

为什么你得到左值错误?

您的条件表达式类似于:

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

在 C 中解析如下:

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

  ^ expression            = value   

并且您不能将值分配给导致左值错误的表达式。

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

但有趣的是,这个你的表达在 C++ 语言中是正确的!
在此处阅读 Charles Bailey 的回答:C 和 C++ 之间的条件运算符差异。您还将在那里找到详细的答案,为什么您会收到左值错误。
我的回答只是对那里的参考

尽管@Daniel Fischer 和@Joachim Pileborg 回答了你两个技巧,但你也可以像这样实现:

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

是的,但这仅在您的情况下才有可能,因为您fd在真/假表达式中都使用

于 2013-03-15T16:34:27.093 回答