用C编写Unix程序时,表达式必须是可修改的左值
所以我试图写这段代码来实现一些函数,这些函数应该在unix编程中获得文件的权限。 t 无论它在哪里使用简单的“If”和“else”条件编写,它都可以工作。 但台词:用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] = '-'; 给我
(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] = '-';