C言語なら俺に聞け 162
at TECH
[
2ch
|
▼Menu
]
■コピペモード
□
スレを通常表示
□
オプションモード
□このスレッドのURL
■項目テキスト
100:デフォルトの名無しさん 23/11/27 08:24:12.52 554QjvZVd.net 左辺値と右辺値のことがよくわからない char *cp = "abcdefgの"abcdefg"は値を変更できないのに、 char cp[] = "abcdefg"の"abcdefg"は値を変更できる 101:はちみつ餃子 23/11/27 09:01:26.52 HtoHgn5y0.net >>100 それは左辺値/右辺値とは関係ない。 「リテラルを書き換えようとしたら未定義」というルールが関与してる。 前者の場合は文字列の場所を示すアドレスが cp に格納されているので cp が指す先というのは文字列リテラルだが 後者の場合は確保された配列を初期化子の文字列で初期化するという理屈なので 配列と文字列リテラルとは別の実体を持ち、リテラルではない配列を書き換えることは問題にならない。 初期化子として文字列が出てくるときは初期化の文法としてちょっと特例があるのと (文字列を含む) 配列は暗黙の型変換で勝手にポインタに変換される特例があって そういう変則的なルールの積み重ねが分かり難い要因だと思う。 リテラルは書き換えたら駄目なのに型の上では文字列リテラルに const はつかない (C++ では const が付く) ので ごく単純な場合を除くと書き換えをコンパイラがコンパイル時にエラーとして検出できないこともある。 なるべく (前後の事情によっては出来ないこともあるけど) 変数には const を付けておくのが良い作法だと思う。 const char *cp = "abcdefg";
次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
レスジャンプ
mixiチェック!
Twitterに投稿
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch
188日前に更新/86 KB
担当:undef