因此,我试图编写这段代码来实现一些函数,这些函数应该在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个操作数的隐式提升。