C言語なら俺に聞け 163 (987レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

189
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 08:22:23.81 ID:JwEVxA0h0(1/6) AAS
>>185
185(1): デフォルトの名無しさん (ワッチョイ 9794-z7on) [sage] 2024/09/15(日) 17:53:23.56 ID:V70NGKYC0(1) AAS
>>68
規格に後置++演算子は実数型とポインタ型にしか使えないとあったけどそれの関係じゃないの?
規格でそう決まってるだけの話では?
配列はポインタに型変換される。 だから型は合うんだよ。
変更可能な左辺値でなければならないという制約に違反してる。
190
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 08:28:07.90 ID:JwEVxA0h0(2/6) AAS
>>182-183
静的記憶域期間ってのは静的+記憶域期間なんだよ。 静的記憶域+期間じゃないんだよ。

まあ静的記憶域期間を持つオブジェクトが配置されている場所を静的記憶域と呼んでもカジュアルな場面ではそんなに不自然ではないとは思うけど。
実装上は専用のセクションに配置するのが普通だし。
195
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 13:26:14.08 ID:JwEVxA0h0(3/6) AAS
>>194
194(1): デフォルトの名無しさん (ワッチョイ 1751-z7on) [sage] 2024/09/16(月) 12:43:08.20 ID:T6H9+ne50(1/2) AAS
>>189
変更可能な左辺値に配列型は含まれないからそれとは違うん?いつポインタに型変換されてんの?

6.3.2.1 より
> 左辺値がsizeof演算子のオペランド,単項&演算子のオペランド,又は文字配列を初期化するのに使われる文字列リテラルである場合を除いて,
> 型“〜型の配列”をもつ式は,型“〜型へのポインタ”の式に型変換する。

式として出てくる配列は一部の例外を除けば問答無用で変換されるので ++ のオペランドに配列が出てくるときも変換後のポインタ (rvalue) に対する演算 (実際には出来ないけど) として解釈されるということでいいと思う。
197
(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 16:28:24.01 ID:JwEVxA0h0(4/6) AAS
>>196
196(1): デフォルトの名無しさん (ワッチョイ 1751-z7on) [sage] 2024/09/16(月) 14:56:21.22 ID:T6H9+ne50(2/2) AAS
>>195
配列オブジェクトの先頭の要素で左辺値じゃないって書いてあるな
ということは左辺値の式の中に出てくる配列は左辺値じゃなくなっちゃうということ?
なんでそんな仕様になったんだろうね
C には配列の要素を指すポインタとは別に配列を指すポインタというものもある。
こんなことが出来る。

int foo[10];
int (*bar)[10] = &foo;

このときの bar の型は int(*)[10] ということになるわけだが……。
型情報として長さが含まれるのはかえって邪魔だ。
大抵の配列を受け取る関数 (str系やmem系など) は配列の大きさが固定ではないから。
配列の先頭要素で配列を代表させる (それが簡単な記法にする) ほうが都合がよかったんじゃないかと思う。
配列全体をひとつの値として扱いたい場合のほうが少ないだろうという判断もそれなりに合理的じゃないかな。

いまどきの言語 (Go とか Rust とか) は範囲を表すスライスという概念を導入して解決してるけど、
C の登場時期だと 2 ワードのオブジェクトを基本型にするのってなんかヤじゃない? と思ったとしても仕方ない。
201
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-6w0d) [sage] 2024/09/16(月) 18:10:03.54 ID:JwEVxA0h0(5/6) AAS
>>199
199(1): デフォルトの名無しさん (スプッッ Sd3f-2MD7) [] 2024/09/16(月) 17:23:46.99 ID:udznqyd1d(2/2) AAS
>>189
>配列はポインタに型変換される。

それは関数呼び出しの場合だぞ
こっちは根拠になる規格の文面を提示してるんだから違うというなら違うと思う根拠を提示して。
207
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) [sage] 2024/09/16(月) 22:43:01.97 ID:JwEVxA0h0(6/6) AAS
>>203
203(1): デフォルトの名無しさん (アウアウエー Sadf-N1Zj) [] 2024/09/16(月) 21:32:46.16 ID:NNTpe0yPa(1) AAS
>>187
たしかに関数の引数だと違うんだな
外部リンク:ideone.com
#include <stdio.h>

char *hoge(char fuga[10])
{
++fuga;
return fuga;
}

int main(void) {
char hage[10] = {0};
char *p = hoge(hage);
printf("%p, %p\n", hage, p);
return 0;
}

// もちろん ++hage は出来ない
外部リンク:ideone.com
余談だけど配列だけじゃなくて関数型も関数ポインタ型に調整されるよ。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.572s*