Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C编写Unix程序时,表达式必须是可修改的左值_C_Unix_Stat_Lvalue - Fatal编程技术网

用C编写Unix程序时,表达式必须是可修改的左值

用C编写Unix程序时,表达式必须是可修改的左值,c,unix,stat,lvalue,C,Unix,Stat,Lvalue,所以我试图写这段代码来实现一些函数,这些函数应该在unix编程中获得文件的权限。 t 无论它在哪里使用简单的“If”和“else”条件编写,它都可以工作。 但台词: (buff->st_mode & S_IRUSR )== S_IRUSR ? retStr[0] = 'r' : retStr[0] = '-'; ((buff->st_mode & S_IWUSR) == S_IWUSR )? retStr[1] = 'w' :retStr[1] = '-'; 给我

所以我试图写这段代码来实现一些函数,这些函数应该在unix编程中获得文件的权限。 t

无论它在哪里使用简单的“If”和“else”条件编写,它都可以工作。 但台词:

(buff->st_mode & S_IRUSR )== S_IRUSR ? retStr[0] = 'r' : retStr[0] = '-';

((buff->st_mode & S_IWUSR) == S_IWUSR )? retStr[1] = 'w' :retStr[1] = '-';
给我上面的警告-“表达式必须是可修改的左值”

你知道为什么吗


谢谢

?:
的运算符优先级高于
=
,因此不能编写

(buff->st_mode&S_IRUSR)=S_IRUSR?retStr[0]=“r”:retStr[0]=“-”

或者它沿着
retStr[0]=('r':retStr[0])=
这当然是胡说八道

修复起来很简单:

retStr[0] = (buff->st_mode & S_IRUSR ) == S_IRUSR ? 'r' : '-';
或者更好:

if ((buff->st_mode & S_IRUSR) == S_IRUSR)
  retStr[0] = 'r';
else
  retStr[0] = '-';

避免使用
?:
仅仅是为了它,它不一定能提高可读性,但它确实伴随着各种微妙的废话,你可以不用它们。不仅仅是运算符优先级,还有第二个和第三个操作数的隐式提升。

三元运算符的优先级高于赋值运算符的优先级(因此更惯用的
i=cond?1:2;
在没有括号的情况下工作)。试着把赋值放在括号里,比如
(buff->st\u mode&S\u IRUSR)==S\u IRUSR?(retStr[0]='r'):(retStr[0]='-')。另外,由于您的使用在C语言中并不惯用(可能更像Perl之类),我建议您不要使用它。@Peter,Monica您能给我的代码举个例子吗?因为我想我已经试过了,顺便说一下,惯用的(和更短的)公式应该是
retStr[1]=(buff->st_mode&S_IWUSR)==S_IWUSR?“w':'-'
您使用整个赋值作为三元右边的替代表达式的想法是有效的,因为在C中赋值是(也)带值的表达式,并且表达式可以是语句(即
i=(a=b);
非常好(不需要括号,我只是为了强调而添加它们);而且如果我没弄错的话,
1;
也是一个有效的声明。
if ((buff->st_mode & S_IRUSR) == S_IRUSR)
  retStr[0] = 'r';
else
  retStr[0] = '-';