以下のステートメントの動作について混乱しています。
*ptr++->str
右辺値を返す最初++
の演算子が適用されます。ptr
次の演算子を->
適用する必要があります。->
演算子は左辺値を必要としませんか?
以下のステートメントの動作について混乱しています。
*ptr++->str
右辺値を返す最初++
の演算子が適用されます。ptr
次の演算子を->
適用する必要があります。->
演算子は左辺値を必要としませんか?
演算子
->
は左辺値を必要としませんか?
いいえ。C99 標準のセクション 6.5.2.3 を参照してください。
演算子の第 1 オペランドは、
->
「修飾または非修飾構造体へのポインター」または「修飾または非修飾共用体へのポインター」型を持ち、第 2 オペランドは、指す型のメンバーを指定する必要があります。...
演算子と識別子が後に続く後置式
->
は、構造体または共用体オブジェクトのメンバーを指定します。値は、最初の式が指すオブジェクトの名前付きメンバーの値であり、左辺値です。
そして、それが問題について言っているすべてです。
これは、構造体の可能な定義である可能性があります。
#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 が文字列定数を指していない場合は、変更可能です。