[過去ログ] C言語なら俺に聞け 163 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
94
(1): (ブーイモ MM45-bJfQ) 2024/09/11(水)15:25 ID:1n/VD1trM(1) AAS
そんなのこだわっても結局関数の引数で配列型では渡せないんだからその程度は受け入れて慣れたほうがいい
95: (ワッチョイ 6663-QZ+t) 2024/09/11(水)15:58 ID:dQ20XCdF0(2/3) AAS
ここは、「聞け」とはあるが、「回答する」とは書いていない
96
(1): (ワッチョイ 1e45-Qzc4) 2024/09/11(水)16:44 ID:+qxKgs2P0(1) AAS
こっちが自然だろ
t[100]を*(t+idx)なんてやる方が何の拘りだよ
97
(1): (ワッチョイ 5ec2-bJfQ) 2024/09/11(水)16:55 ID:tx1pt4w10(1) AAS
その程度どっちでもいい
98: 警備員[Lv.4][新芽] (ワッチョイ 8afb-ztXh) 2024/09/11(水)20:45 ID:l6JSnCmY0(1) AAS
配列は外部リンケージのときも注意が必要なんだよね
あまりそういう使い方しないから、すぐにはピンとこないや
99: (ワッチョイ 65cd-RtM0) 2024/09/11(水)22:04 ID:+V4MmH6p0(1) AAS
>>93
別にまともでもない
配列で定義してポインタで操作できるのがCの柔軟性だから
idxにこだわると簡単な操作を複雑にしかねない
100: (ワッチョイ 6663-QZ+t) 2024/09/11(水)23:11 ID:dQ20XCdF0(3/3) AAS
> while (*(t+i) = *s++)

これは、

> while (*t++ = *s++)
;これがエラーになるのは何故かと言う質問から始まったからです

t++がエラーで、t+iなら大丈夫が理解できれば解決だと思う
ポインタの理解というのは壁にはなりますが、
乗り越えれば意外と簡単です、がんばれ!
101
(1): 警備員[Lv.7][新芽] (ワッチョイ f931-ztXh) 2024/09/12(木)00:58 ID:QGeKjVfA0(1) AAS
>>92 ありがとうございました(sには実態がない)

gcc -S test.c
で .s を出力して眺めてみると、そのような感じになっていました
最適化と、AT&Tのオペランドが逆なのに慣れず読みにくかったですが

"hoge" は「実体」が .data に置かれ、実行時にスタックにコピーされるのかと想像してましたが、実装がどうあれ、スタッフ上に "hoge" を置くための元を実体というのは違うと思いました

実際、"hoge" は .db でアロケートされず、4字は 32ビットの数値定数とされ、スタックに即値で転記されていました(実行時に生成されていました)

# とても伝わりにくいと思いますが…
102
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/12(木)08:54 ID:TbaO6N6i0(1) AAS
誰も説明してなかったことに気づいた。
E1[E2] が (*((E1)+(E2))) と等価であるというルールがある。
103
(1): (ワッチョイ 8a5c-8qrK) 2024/09/12(木)21:59 ID:m7IlJoP80(1) AAS
それいにしえからのバカ発見器なんだが2024年になってもまだ動いてるとはC言語おそるべし
104: 警備員[Lv.3][新芽] (ワッチョイ b68a-ztXh) 2024/09/12(木)23:41 ID:+nQe2m720(1) AAS
次の方どうぞ
105: (ワッチョイ a6ee-865n) 2024/09/12(木)23:43 ID:sEtsUeoh0(1) AAS
>>103
その自由度があるからC++でhtbl["key"]の様な事が出来る
Cじゃ意味ない仕様だけど、禁止する必要も無かろう
106
(1): (ワッチョイ 65cd-RtM0) 2024/09/13(金)08:23 ID:ykZRrldI0(1/2) AAS
>>101
"hoge"は長さちょうど32ビットだから即値でスタックに書き込むようになってるということなら
最適化によってそこまで省略されてるわけでsに実体がない件とはあまり関係ないな
最適化オフにするかもっと長い文字列で実験してみては
107: 警備員[Lv.5][新芽] (ワッチョイ 1eeb-ztXh) 2024/09/13(金)09:12 ID:cjEIJ97r0(1/4) AAS
>>106
ありがとうございます

もう少し正確に書けばよかったのですが、4字と '\0' の2回に分けて転記していました
また、hogeを長くして(10字くらい?)試すと、やはり 4字ずつ整数にパックして即値で転記していました

もっと長大な文字列試せば、別にアロケートされたそれをコピーするコードが吐かれたかもしれませんが、>>92 の指摘通り、実体がなく実行時に生成されることを確認できたとして打ち切ってしまいました
108
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 65e8-hr+9) 2024/09/13(金)10:12 ID:9XTDQHQm0(1/2) AAS
C の仕様は抽象機械の動作として記述される。
抽象機械の動作をどのように実際の機械と対応させるかは自由で、見かけ上の動作が同じならどういう機械語になってもいい。
生成された機械語から言語仕様を理解しようとすべきではないよ。

低レイヤプログラミングするならどう対応付くか知る必要がある場合もあるのは否定しないけど……
109
(1): (ブーイモ MM45-bJfQ) 2024/09/13(金)10:23 ID:OBSQyTYbM(1/2) AAS
その抽象機械の定義はしょせん後付け
c言語のソースから生成されるマシン語の想像が付くようになるのはいいこと
110: (ワッチョイ 6663-QZ+t) 2024/09/13(金)10:25 ID:y2ap91b60(1/3) AAS
C言語ハンドコンパイラ
111
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 65e8-hr+9) 2024/09/13(金)11:25 ID:9XTDQHQm0(2/2) AAS
>>109
機械語の想像がつくのが不要とも悪いとも言ってないよ。
そこから言語仕様を理解しようとすべきじゃないと述べてる。
できないから。
112: (ワッチョイ a510-IFMZ) 2024/09/13(金)11:46 ID:HT/On1VB0(1) AAS
所詮部外者の推測。
113: (ワンミングク MM7a-k+ON) 2024/09/13(金)12:46 ID:CiewPVvpM(1) AAS
今日は患者が多いですね
114: (ブーイモ MM45-bJfQ) 2024/09/13(金)12:53 ID:OBSQyTYbM(2/2) AAS
>>111
無用な心配
Xに溢れてるクソリプと同じ
115: 警備員[Lv.1][新芽] (ワッチョイ 1e86-ztXh) 2024/09/13(金)13:50 ID:cjEIJ97r0(2/4) AAS
>>108
ありがとうございます

そもそも >>88 で sの実体がないとはどういうことか、というのが疑問だったためで、言語の仕様(というか実装)がどうかには着目していませんでした

printf("%s\n", s); が .sではputs(s); に置き換えられていたり
そうだよな〜
116: 警備員[Lv.1][新芽] (ワッチョイ 1e49-ztXh) 2024/09/13(金)13:59 ID:cjEIJ97r0(3/4) AAS
あー、実装には注目してるのか>自分
117: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-hr+9) 2024/09/13(金)14:32 ID:7dvxgxgq0(1/3) AAS
この場合に限っては言語仕様としての理屈もあんまり違わんけどな。
ただ、正式な用語を知ってると細かいことを調べやすいみたいなのはあるので便利。
118
(1): (JP 0H3e-voeu) 2024/09/13(金)16:10 ID:HymUJJD5H(1/5) AAS
gccは配列に確保した短い文字列は最適化無しでもレジスターに載せてしまってるな
ポインター文字列は最適化してもレジスターには載らない
なので配列は配列として使った方が最適化で高速化される可能性があるという事だな
119
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) 2024/09/13(金)16:26 ID:7dvxgxgq0(2/3) AAS
ポインター文字列って変な言葉だな。
この場の造語だと思うけど
char *foo = "bar";
みたいなやつのことだよね?

文字列リテラルは静的記憶域期間 (寿命はプログラムの最初から最後まで) を持つオブジェクト。
どこかにある文字列をポインタで指しているという状況。
そのどこかにある文字は他のどこかから指し示されることもありうるので簡単には消えられない。

その一方で、配列の初期化子は配列を初期化する以外に使われる可能性がない。
120: (アウアウエー Sa52-t/33) 2024/09/13(金)16:36 ID:bblj+c3pa(1/2) AAS
>>93
それのどこがマトモなんだよ

>>94 の言い分の方が正しい
配列型が無いんだから
121: (アウアウエー Sa52-t/33) 2024/09/13(金)16:38 ID:bblj+c3pa(2/2) AAS
>>96
>t[100]を*(t+idx)
t[100]を100[t]
よりはマシ

>>97
だよな
122
(2): (JP 0H3e-voeu) 2024/09/13(金)17:26 ID:HymUJJD5H(2/5) AAS
>>119
んなこたーない
char foo[] = "hoge";
char* bar = &foo[1]; /* 敢えてずらしてみる */
printf("bar -> %s\n", bar);
で中身は何度も参照されるぞ
gccで試してみたら敢えてずらしてポインターに代入されたとしても、レジスターに文字列を保持したままprintfに渡すというトリッキーなコードが生成されたw
スタックに文字列を書き込んでそのアドレスを渡してるっぽい
123: (JP 0H3e-voeu) 2024/09/13(金)17:45 ID:HymUJJD5H(3/5) AAS
短い配列文字列をポインターに代入したらレジスターに保持する最適化を諦めるかと思ったら、そうじゃなくて意地でもレジスターに保持したまま処理を進めるgccスゲーよw
clangの場合はポインターも配列も常に静的に文字列を定義したものを使ってた
1-
あと 879 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.019s