C言語なら俺に聞け 163 (987レス)
上下前次1-新
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
133: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-hr+9) 2024/09/14(土)00:19 ID:N2YvcTj50(1/14) AAS
低レイヤに関わる資料が C を前提に書かれていたりするのは普通のことなのでたとえ C でプログラミングしなくてもある程度は身に付いてないと困ることはあるだろう。
137(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)08:59 ID:N2YvcTj50(2/14) AAS
>>134
> printfで中身が表示
意味が解らん。
表示されてる中身というのは foo の中身であってリテラルじゃないだろ。
> リテラルは単なる定数の簡略表記
整数リテラルなどは右辺値だが文字列リテラルに限っては左辺値。
文字列リテラルは実行フェイズにおいてオブジェクトとしての性質を持つということ。 (抽象機械の上では。)
ただし、この文字列リテラルが型変換された結果によって生まれるポインタはアドレス定数の要件を満たす。
139: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)10:49 ID:N2YvcTj50(3/14) AAS
>>138
前述の通り整数リテラルは右辺値 (rvalue)。
文字列リテラルは例外的な存在だ。
まず、 C の用語では「オブジェクト」と「値」は違う意味を持つ。
メモリ上のビットパターンがオブジェクトで、値は式の結果だ。
(規格用語では data storage だがここではあえてカジュアルな用語で言うことにする。)
そして式の結果は lvalue と rvalue に区分される。
オブジェクトに結び付いている値が lvalue だと考えていい。
個々に規定があるので詳細は割愛するが、
式の中で変数名だとか単項 * 演算だとか [] とかがあればそれはメモリ上に存在してるのは明白だろ?
省5
140(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)12:58 ID:N2YvcTj50(4/14) AAS
>>138
このときの 1 というリテラルは (rvalue の) 1 を返す式で、その値が i にコピーされた後で寿命を終えて消滅する。
printf の引数の i で取り出される 1 は i に入っている 1 であってリテラルの 1 じゃない。
整数リテラルはあくまでも整数を返す (生成すると言ってもいいかも?) 式であって、メモリ上のどこかにあるオブジェクトというわけじゃない。
142(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-hr+9) 2024/09/14(土)13:40 ID:N2YvcTj50(5/14) AAS
>>141
>>122 の bar が参照しているのは文字列リテラルからコピーされた配列であって文字列リテラルではない。
文字列リテラルが破棄されないこととは独立した話だよ。
144: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-hr+9) 2024/09/14(土)13:55 ID:N2YvcTj50(6/14) AAS
>>143
そのポインタが指しているという意味で参照してると言ってる。
なにを言いたいんだ?
論点は「配列の初期化子として現れる文字列リテラルは配列の初期化以外に使われる可能性がない」という話だろ。
146(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)14:20 ID:N2YvcTj50(7/14) AAS
>>145
bar はどうでもいいよ。 それは要らん間接参照を入れて例としてよくわからんようになってるから
飛び飛びになってる私の書いてることをあらためてまとめると
・ char foo[] = "hoge"; といったような記述があれば "hoge" によって foo を初期化する。
・ このときの文字列リテラル "hoge" は foo を初期化するだけに使われて他からアクセスされる可能性がない。
・ 言語規格の建前上は文字列リテラルの寿命はプログラムの最初から最後までだが……
・ この場合は他からアクセスされる可能性がないから機械語レベルでは文字列リテラルは最適化で消えて (即値としてコードに埋め込んで) も問題にならない。
148: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-hr+9) 2024/09/14(土)16:47 ID:N2YvcTj50(8/14) AAS
>>147
補足したつもりだが。
どう最適化するにしても規格に反する挙動にしてはならない (したら規格に対応しているとは名乗れない) からどうしてそれで規格に反しないのかの観点から説明した。
152: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)17:26 ID:N2YvcTj50(9/14) AAS
>>149
それはそう。 原則としては言語の理屈に従っておくのが良い。
繰り返すけど、少なくとも初心者に対して低レイヤの観点で C を説明するのは筋が悪いと思う。
153(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)17:33 ID:N2YvcTj50(10/14) AAS
>>151
> 参照可能だ
その時参照してるのはスタック上にある配列であって、文字列リテラルではないってのを俺は何度書けばいいんだ?
文字列リテラルは本来は「プログラムの開始から終わりまでの寿命を持つオブジェクト」としてあらねばならないのが、
実際には文字列リテラルではない形になってることを「消えてる」と表現したのは確かに微妙な表現だったかもしれないが、
有るべき場所から消えてるんだからそんくらいわかるだろ。
そもそも最初は char* foo = "hoge"; との対比で言ってたんだから。
155(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)18:35 ID:N2YvcTj50(11/14) AAS
>>154
初期化子の文法の一部であって式の規則の適用範囲外じゃないの?ってことだよね?
6.7.8 を見てこの場合でも式だと解釈してるけど、そういわれたらちょっと自信がないかも。
159: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-hr+9) 2024/09/14(土)19:58 ID:N2YvcTj50(12/14) AAS
>>154
結果的な挙動からするとどっちでも良いから書いてないだけかも。
164: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)22:32 ID:N2YvcTj50(13/14) AAS
>>163
せやで。 だから最適化の余地があるという話をしてる。
171(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/14(土)23:53 ID:N2YvcTj50(14/14) AAS
>>167
起きていることは >>127 でこれ以上なく具体的に説明されてるんだから改めて厳密に表現しないと理解できないとは思わなかったんだよ。
>>168
文字列リテラルが静的記憶域期間を持つことは 6.4.5 に書かれてる。
実行フェイズに存在するオブジェクトだよ。 (最適化を抜きにして仕様通りに解釈すれば。)
配列の初期化子として現れる文字列リテラルの扱いは微妙かもという話が >>154 >>158 の指摘だが、
記憶域期間についての記述は文脈を指定せず文字列リテラル全部を対象にした記述に見える。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.042s