[過去ログ]
C言語なら俺に聞け 163 (1002レス)
C言語なら俺に聞け 163 http://mevius.5ch.net/test/read.cgi/tech/1721137434/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
171: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/14(土) 23:53:27.27 ID:N2YvcTj50 >>167 起きていることは >>127 でこれ以上なく具体的に説明されてるんだから改めて厳密に表現しないと理解できないとは思わなかったんだよ。 >>168 文字列リテラルが静的記憶域期間を持つことは 6.4.5 に書かれてる。 実行フェイズに存在するオブジェクトだよ。 (最適化を抜きにして仕様通りに解釈すれば。) 配列の初期化子として現れる文字列リテラルの扱いは微妙かもという話が >>154 >>158 の指摘だが、 記憶
域期間についての記述は文脈を指定せず文字列リテラル全部を対象にした記述に見える。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/171
172: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/15(日) 00:57:56.19 ID:/wZr5+b/0 >>163 そりゃ書き換える場合があるからでしょー 一個しかなかったら関数呼ばれるたびに初期値も書き換わってしまう なんで悩んでるのこの人? constつけたら一個ですむだろ多分 http://mevius.5ch.net/test/read.cgi/tech/1721137434/172
173: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 01:17:55.27 ID:STy65/7c0 >>171 > 実行フェイズに存在するオブジェクトだよ。 存在してんじゃねーかよ! これが最適化で消えて良いかの話だよ! gccの場合は命令コードに埋め込んでるけど、消えてる訳じゃないし、別のポインターから参照可能だ http://mevius.5ch.net/test/read.cgi/tech/1721137434/173
174: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/15(日) 01:30:47.17 ID:B6k8li/O0 >>173 配列とその初期化子として現れる文字列リテラルが別の存在だってことが俺が何度も書いてることだよ。 これがそんなに何度も何度も何度も何度も書かないと理解できないようなことか? 別のポインタは配列を指せるが、その初期化子として現れる文字列リテラルを指せるわけじゃない。 char* foo = "hoge"; のようなケースではポインタ foo は文字列リテラルを指してるということと対比しての話だぞ。 http://mevius.5ch.ne
t/test/read.cgi/tech/1721137434/174
175: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 01:32:35.13 ID:STy65/7c0 ちなみに「文字列リテラル」が「実行時」に存在してる訳では全くない はちみつはそこを勘違いしてる 静的記憶期間というのはスコープの事だ まぁエクステントと言った方が正確だが それはコンパイラーが理解できるものだが、それと「実行時」に存在する値を結びつけてはいけないし関係無い DLLだとしたら静的記憶期間の変数も実行時には存在しない可能性もある スレッドローカルストレージの変数もそうだな 要するに文字列リテラルで生成されたデー
タは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない それをずっと言ってる http://mevius.5ch.net/test/read.cgi/tech/1721137434/175
176: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 01:38:12.52 ID:STy65/7c0 >>174 > 文字列リテラルを指せるわけじゃない。 はい、これが間違いの全て 文字列リテラルはコンパイラーだけが理解できる「構文」に過ぎない それを実行時にさせないとはこれいかに?w 文字列リテラルは「実行時」には何て名前になってんだ? 配列でもないぞ 配列に代入される前のrvalueの事だ まぁ文字列は例外的にlvalueにもなれるが、rvalueであることには違いない http://mevius.5ch.net/test/read.cgi/tech/1721137434/176
177: デフォルトの名無しさん (ワッチョイ 9f56-3vlU) [sage] 2024/09/15(日) 01:45:15.62 ID:hg9QOZOF0 >>171 なんかいろいろ書いたけど最終的には自分もそれで合っていると思う 実用上は正直どこで役に立つのかあまり思いつかないが、規格上どういう建て付けになってるのかはとりあえず理解できたかも というか、実用上あんまり役に立つわけじゃないから今まで調べもしなかったというか 規格上は「リテラル」は存在せず integer/enumeration/floating/character は定数なんですね それで定数は記憶域期間を持たない 文字列リテラルは静的記憶域期
間を持つ 複合リテラルは関数本体の外か中かに応じて静的/自動記憶域期間を持つ、と うーんでもなあ 某言語でいきなり &1 とか書けるの知ってたら別に定数にも記憶域期間持たせればいいじゃんとか思っちゃうなあ とりあえずそうなっているというだけか http://mevius.5ch.net/test/read.cgi/tech/1721137434/177
178: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/15(日) 01:46:17.50 ID:B6k8li/O0 >>175 > 静的記憶期間というのはスコープの事 ちがう。 記憶域期間はオブジェクトの寿命の区分。 6.2.4 を参照のこと。 寿命の区分が設定されている以上はオブジェクト (メモリ上のどこかにある) のこと。 > 文字列リテラルで生成されたデータは実行時には確実にアクセス可能で、消えてるなんて全くあり得ない 関数 (C のプログラムは関数の集合なので実質的にプログラムの全て) はオブジェクトではない。 私が「消える」と表現し
たのはこの意識があったからだが、機械語のレベルでどこかには存在するという意味ではそりゃ存在するだろう。 (同じ内容が連続する配列だったらループで書き込むような形にすることもあるかもしれない。) 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし、ポインタで指すことは出来ない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/178
179: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/15(日) 01:53:34.48 ID:B6k8li/O0 >>177 C++ の右辺値参照も左辺値参照も左辺値なんだよね。 参照を経由したら左辺値になるなら最初からそう出来ないか? と思ったことはある。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/179
180: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 01:58:39.53 ID:STy65/7c0 >>178 > ちがう。 記憶域期間はオブジェクトの寿命の区分。 だからエクステントと書いてんだろ! もしかして理解出来なかったか? > 配列の初期化子としての文字列リテラルは本来あるべき場所 (オブジェクト) から最適化で消えてるし 本来あるべき場所(オブジェクト)って何だよ?! 目茶苦茶だなw これがコンパイラーと実行時に存在すべき値(rvalue)をごっちゃにした成れの果てだなw http://mevius.5ch.net/test/read.cgi/tech/1721137
434/180
181: デフォルトの名無しさん (ワッチョイ ffe1-1pYN) [sage] 2024/09/15(日) 02:33:43.11 ID:STy65/7c0 初期化に使われた(文字列)リテラルが実行時にrvalueになったものに名前を付けるべきだな これは最適化でも消えることはない(当たり前だが…) 名前がないとまたリテラルは消えるから参照出来ない野郎が発生しかねないw http://mevius.5ch.net/test/read.cgi/tech/1721137434/181
182: デフォルトの名無しさん (スッップ Sdbf-2MD7) [] 2024/09/15(日) 12:24:08.15 ID:WkBCL5VYd >>174 >char* foo = "hoge"; > >のようなケースではポインタ foo は文字列リテラルを指してる その表現が間違ってる。 fooは静的記憶域を指してるが正しい。 intptr_t *bar = 0xAABB; この場合数値リテラルを指すなんて言わんだろ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/182
183: 警備員[Lv.2][新芽] (ワッチョイ 5707-/vo+) [sage] 2024/09/15(日) 13:50:20.31 ID:krajCak80 >>char* foo = "hoge"; >> >>のようなケースではポインタ foo は文字列リテラルを指してる > >その表現が間違ってる。 >fooは静的記憶域を指してるが正しい。 彼も文字列リテラルは静的記憶域に置かれると言ってなかったっけ 僕にはこの2つの違いが分からないや 勘違いだったらごめんなさい http://mevius.5ch.net/test/read.cgi/tech/1721137434/183
184: デフォルトの名無しさん (ブーイモ MM8f-GITO) [sage] 2024/09/15(日) 16:04:15.59 ID:7leD3hDGM もっと中身のある話しようぜ http://mevius.5ch.net/test/read.cgi/tech/1721137434/184
185: デフォルトの名無しさん (ワッチョイ 9794-z7on) [sage] 2024/09/15(日) 17:53:23.56 ID:V70NGKYC0 >>68 規格に後置++演算子は実数型とポインタ型にしか使えないとあったけどそれの関係じゃないの? 規格でそう決まってるだけの話では? http://mevius.5ch.net/test/read.cgi/tech/1721137434/185
186: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/15(日) 18:13:20.02 ID:/tCGodXOd それだな http://mevius.5ch.net/test/read.cgi/tech/1721137434/186
187: デフォルトの名無しさん (ワッチョイ d7cd-qbvN) [sage] 2024/09/15(日) 21:42:32.09 ID:/wZr5+b/0 ちなみに int main(int argc, char *argv[]) と定義しても argvは++できる http://mevius.5ch.net/test/read.cgi/tech/1721137434/187
188: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/15(日) 23:27:23.69 ID:dUpBu3ui0 main の引数だけど、人によって好みがある *argv[]だったり、 **argvだったり、 さすがにargv[][]はいないと思う http://mevius.5ch.net/test/read.cgi/tech/1721137434/188
189: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 08:22:23.81 ID:JwEVxA0h0 >>185 配列はポインタに型変換される。 だから型は合うんだよ。 変更可能な左辺値でなければならないという制約に違反してる。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/189
190: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 08:28:07.90 ID:JwEVxA0h0 >>182-183 静的記憶域期間ってのは静的+記憶域期間なんだよ。 静的記憶域+期間じゃないんだよ。 まあ静的記憶域期間を持つオブジェクトが配置されている場所を静的記憶域と呼んでもカジュアルな場面ではそんなに不自然ではないとは思うけど。 実装上は専用のセクションに配置するのが普通だし。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/190
191: デフォルトの名無しさん (ワッチョイ 776e-SKTh) [sage] 2024/09/16(月) 08:30:39.50 ID:+a4Swf1f0 ここまでのまとめ Cは生産性が低い C使いも生産性が低い http://mevius.5ch.net/test/read.cgi/tech/1721137434/191
192: デフォルトの名無しさん (ワッチョイ ff63-y7MN) [sage] 2024/09/16(月) 10:51:57.39 ID:yKwOC4kA0 ID:+a4Swf1f0 は、言語に何使おうと生産性が低そう http://mevius.5ch.net/test/read.cgi/tech/1721137434/192
193: デフォルトの名無しさん (ワッチョイ ff2a-48Tr) [] 2024/09/16(月) 11:29:42.22 ID:0nzerU0W0 >>191,192 生産性など、君ら社畜を計る尺度に過ぎんよ。 芸術家は、時間をかけて1行の美しさを追及するものだ。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/193
194: デフォルトの名無しさん (ワッチョイ 1751-z7on) [sage] 2024/09/16(月) 12:43:08.20 ID:T6H9+ne50 >>189 変更可能な左辺値に配列型は含まれないからそれとは違うん?いつポインタに型変換されてんの? http://mevius.5ch.net/test/read.cgi/tech/1721137434/194
195: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 13:26:14.08 ID:JwEVxA0h0 >>194 6.3.2.1 より > 左辺値がsizeof演算子のオペランド,単項&演算子のオペランド,又は文字配列を初期化するのに使われる文字列リテラルである場合を除いて, > 型“〜型の配列”をもつ式は,型“〜型へのポインタ”の式に型変換する。 式として出てくる配列は一部の例外を除けば問答無用で変換されるので ++ のオペランドに配列が出てくるときも変換後のポインタ (rvalue) に対する演算 (実際には出来ないけど) と
して解釈されるということでいいと思う。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/195
196: デフォルトの名無しさん (ワッチョイ 1751-z7on) [sage] 2024/09/16(月) 14:56:21.22 ID:T6H9+ne50 >>195 配列オブジェクトの先頭の要素で左辺値じゃないって書いてあるな ということは左辺値の式の中に出てくる配列は左辺値じゃなくなっちゃうということ? なんでそんな仕様になったんだろうね http://mevius.5ch.net/test/read.cgi/tech/1721137434/196
197: はちみつ餃子 ◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 16:28:24.01 ID:JwEVxA0h0 >>196 C には配列の要素を指すポインタとは別に配列を指すポインタというものもある。 こんなことが出来る。 int foo[10]; int (*bar)[10] = &foo; このときの bar の型は int(*)[10] ということになるわけだが……。 型情報として長さが含まれるのはかえって邪魔だ。 大抵の配列を受け取る関数 (str系やmem系など) は配列の大きさが固定ではないから。 配列の先頭要素で配列を代表させる (それが簡単な記法にする) ほうが都合がよかった
んじゃないかと思う。 配列全体をひとつの値として扱いたい場合のほうが少ないだろうという判断もそれなりに合理的じゃないかな。 いまどきの言語 (Go とか Rust とか) は範囲を表すスライスという概念を導入して解決してるけど、 C の登場時期だと 2 ワードのオブジェクトを基本型にするのってなんかヤじゃない? と思ったとしても仕方ない。 http://mevius.5ch.net/test/read.cgi/tech/1721137434/197
198: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/16(月) 17:22:11.94 ID:udznqyd1d >>190 横からすまんが、記憶域期間って言葉も変 http://mevius.5ch.net/test/read.cgi/tech/1721137434/198
199: デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/16(月) 17:23:46.99 ID:udznqyd1d >>189 >配列はポインタに型変換される。 それは関数呼び出しの場合だぞ http://mevius.5ch.net/test/read.cgi/tech/1721137434/199
200: デフォルトの名無しさん (ワッチョイ bf79-MnYn) [sage] 2024/09/16(月) 17:29:54.17 ID:E0fXFEgV0 この糞コテは半端知識のかまちょだからNGやスルー推奨 http://mevius.5ch.net/test/read.cgi/tech/1721137434/200
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 802 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.027s