我对以下声明的工作感到困惑:
*ptr++->str
第一个++
运算符应用于返回rvalue的ptr
。必须应用下一个运算符->
。 ->
运算符不需要左值?
答案 0 :(得分:1)
不
->
运算符需要左值?
没有。见C99标准第6.5.2.3节:
->
运算符的第一个操作数应具有指向限定或不合格的类型''指针 结构''或''指向合格或不合格的联合''的指针,第二个操作数应为 命名指向该类型的成员。...
后缀表达式后跟
->
运算符,标识符指定成员 结构或联合对象。该值是对象的指定成员的值 第一个表达式指向的,并且是左值。
这就是关于此事的所有内容。
答案 1 :(得分:0)
这可能是结构的可能定义。
#include <stdio.h>
struct fuzz {
char *str;
} stuff = {"Hi there!"} ;
struct fuzz *ptr = &stuff;
int main()
{
char ch='@';
printf("Before: p=%p, ch=%c\n", (void*) ptr, ch);
ch = *ptr++->str;
printf("After: p=%p, ch=%c\n", (void*) ptr, ch);
return 0;
}
输出:
Before: p=0x601020, ch=@
After: p=0x601028, ch=H
输出证明指针表达式是左值。可修改,如果str不指向字符串常量。