K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[810] Re:左辺値としての配列名
返信


投稿者:774RR
2007/02/20 02:13:25

Link:
なんとなくネタ的に面白いので追加検証。gcc ならソースコードがあるので読んでみた。
gcc-3.4.5 を追っかけ。 gcc-4 では大幅な変更が入っているので変わっているかもしれない。

int array[1];
array=0;
なるソースコードに対する挙動

C の場合 gcc/c-typeck.c Line 3677 でエラーメッセージを出力
これは convert_for_assignment() 関数の末尾である。この関数の先頭部分で
  if (TREE_CODE (TREE_TYPE (rhs)) == ARRAY_TYPE
      || TREE_CODE (TREE_TYPE (rhs)) == FUNCTION_TYPE)
    rhs = default_conversion (rhs);
なるコードが実行されている(すなわち右辺はデフォルト変換が実施されている)
のに対して左辺のデフォルト変換を行うコードは見当たらない。
=代入式の左辺においては「配列名を先頭へのポインタに読み替える」変換は実施していない

C++ の場合 gcc/cp/typeck.c Line 5295 でエラーメッセージを出力
これは build_modify_expr() 関数の一部であり
  if (TREE_CODE (lhstype) == ARRAY_TYPE)
の内側にある。この例では右辺左辺の型が異なるのでこのエラー。
もし array=array; であるなら、型一致なのでこの行ではなく先に進んで
ISO C++ forbids assignment of arrays エラーが発生。
いずれにせよ左辺のデフォルト変換を行う関数は呼ばれていない。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より新しい投稿] [ より古い投稿]