我不想在追加模式下打开文件或根据$ 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作为赋值的左操作数?
答案 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