Unix程序中的C,表达式必须是可修改的左值



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

char* getFilePremissions(struct stat* buff){
char* retStr = malloc(SIZE_OF_PREM_BITS+1); /* Allocating 10 bits for string to be returned */
/* Owner premissions: */
(buff->st_mode & S_IRUSR )== S_IRUSR ? retStr[0] = 'r' : retStr[0] = '-';
((buff->st_mode & S_IWUSR) == S_IWUSR )? retStr[1] = 'w' :retStr[1] = '-';

if((buff->st_mode & S_IXUSR) == S_IXUSR ) retStr[2] = 'x';
else retStr[2] = '-';

/* Group premissions */
if((buff->st_mode & S_IRGRP) == S_IRGRP ) retStr[3] = 'r';
else retStr[3] = '-';
if((buff->st_mode & S_IWGRP) == S_IWGRP ) retStr[4] = 'w';
else retStr[4] = '-';

无论在哪里用简单的";如果";以及";否则";工作条件。但是线路:

(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] = '-';

或者它沿着CCD_ 4的线进行解析,这当然是无稽之谈。

修复起来很简单:

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

或者更好:

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

避免仅仅为了?:而使用它,它不一定能提高可读性,但它确实有各种微妙的垃圾,人们可以不用。不仅运算符优先级,而且第2个和第3个操作数的隐式提升。

最新更新