0

以下のステートメントの動作について混乱しています。

*ptr++->str

右辺値を返す最初++の演算子が適用されます。ptr次の演算子を->適用する必要があります。->演算子は左辺値を必要としませんか?

4

2 に答える 2

1

演算子->は左辺値を必要としませんか?

いいえ。C99 標準のセクション 6.5.2.3 を参照してください。

演算子の第 1 オペランドは、->「修飾または非修飾構造体へのポインター」または「修飾または非修飾共用体へのポインター」型を持ち、第 2 オペランドは、指す型のメンバーを指定する必要があります。

...

演算子と識別子が後に続く後置式->は、構造体または共用体オブジェクトのメンバーを指定します。値は、最初の式が指すオブジェクトの名前付きメンバーの値であり、左辺値です。

そして、それが問題について言っているすべてです。

于 2012-07-15T13:48:49.277 に答える
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 が文字列定数を指していない場合は、変更可能です。

于 2012-07-15T13:59:22.933 に答える