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

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
192
(1): (ワッチョイ ff63-y7MN) 2024/09/16(月)10:51 ID:yKwOC4kA0(1/2) AAS
ID:+a4Swf1f0 は、言語に何使おうと生産性が低そう
193: (ワッチョイ ff2a-48Tr) 2024/09/16(月)11:29 ID:0nzerU0W0(1) AAS
>>191,192
生産性など、君ら社畜を計る尺度に過ぎんよ。
芸術家は、時間をかけて1行の美しさを追及するものだ。
194
(1): (ワッチョイ 1751-z7on) 2024/09/16(月)12:43 ID:T6H9+ne50(1/2) AAS
>>189
変更可能な左辺値に配列型は含まれないからそれとは違うん?いつポインタに型変換されてんの?
195
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/16(月)13:26 ID:JwEVxA0h0(3/6) AAS
>>194

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

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

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

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

いまどきの言語 (Go とか Rust とか) は範囲を表すスライスという概念を導入して解決してるけど、
C の登場時期だと 2 ワードのオブジェクトを基本型にするのってなんかヤじゃない? と思ったとしても仕方ない。
198: (スプッッ Sd3f-2MD7) 2024/09/16(月)17:22 ID:udznqyd1d(1/2) AAS
>>190
横からすまんが、記憶域期間って言葉も変
199
(1): (スプッッ Sd3f-2MD7) 2024/09/16(月)17:23 ID:udznqyd1d(2/2) AAS
>>189
>配列はポインタに型変換される。

それは関数呼び出しの場合だぞ
200: (ワッチョイ bf79-MnYn) 2024/09/16(月)17:29 ID:E0fXFEgV0(1) AAS
この糞コテは半端知識のかまちょだからNGやスルー推奨
201
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-6w0d) 2024/09/16(月)18:10 ID:JwEVxA0h0(5/6) AAS
>>199
こっちは根拠になる規格の文面を提示してるんだから違うというなら違うと思う根拠を提示して。
202: (アウアウウー Sa5b-E6+g) 2024/09/16(月)18:57 ID:ISRAyNkZa(1) AAS
>>188
そらargv[][]では誤りだもんな
203
(1): (アウアウエー Sadf-N1Zj) 2024/09/16(月)21:32 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
204: (ワッチョイ bf4f-NiVF) 2024/09/16(月)22:10 ID:hHcIxSUD0(1) AAS
>>197
流石に言ってる事が的外れ過ぎるのでもうちょっと勉強した方がいいと思うよ
205
(1): 警備員[Lv.1][新芽] (ワッチョイ f731-/vo+) 2024/09/16(月)22:25 ID:z+htC2pc0(1/2) AAS
恥ずかしながら、静的記憶域期間(で合ってるのか?)という言葉を知らなくて、ライフタイムは「静的」に含意されているのかと思ったワ…
しかし、記憶域期間って違和感あるなぁ
206: 警備員[Lv.1][新芽] (ワッチョイ f731-/vo+) 2024/09/16(月)22:30 ID:z+htC2pc0(2/2) AAS
わけわからん
>>205は撤回します
207
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ f732-vU+L) 2024/09/16(月)22:43 ID:JwEVxA0h0(6/6) AAS
>>203
余談だけど配列だけじゃなくて関数型も関数ポインタ型に調整されるよ。
208
(1): (ワッチョイ 9f7c-2MD7) 2024/09/16(月)22:52 ID:TDYyKtgo0(1) AAS
>>201
規格に配列は常にポインタに変換されるなんて書いて無いぞ。
209: 2024/09/16(月)23:00 ID:f3T7KT8T0(1) AAS
>>208
「常に」とは書かれていない
「ポインタに変換される」ではなく「ポインタに型変換される」

>>102がまさにそれでしょ
E1という配列が関数呼び出しでない場合においてもポインタという型に変換されているから出来ること
210
(1): (ワッチョイ ff63-y7MN) 2024/09/16(月)23:10 ID:yKwOC4kA0(2/2) AAS
>char *hoge(char fuga[10])

こう書いてあっても、関数内で10を使う訳ではない
関数内で仮に100個めの要素アクセスするロジック書いてもエラーにはならない
(実行時にはエラーになると思う、多分)

だから、
>char *hoge(char fuga[])
添え字無しにしても良いことになる
211: (ワッチョイ d7cd-qbvN) 2024/09/17(火)01:04 ID:BokinMog0(1) AAS
>>210
元々ローカルでchar hage[10];と定義して10以上をアクセスしてもコンパイル時にはエラーにならないでしょ

引数に[10]と書くとしたら可読性のため(この関数では[0~9]までアクセスする可能性があると明示するため)
212
(1): (スプッッ Sd3f-2MD7) 2024/09/17(火)10:15 ID:9gub94Dsd(1/3) AAS
__FILE__ とか __LINE__ は大文字なのになんで __func__ は小文字なん?
213: (アウアウエー Sadf-N1Zj) 2024/09/17(火)10:17 ID:TMGdiCOOa(1/2) AAS
範囲の問題じゃなくて
++hage または hage++ が出来るか出来ないかが問題なんです
214
(1): (ワッチョイ ff63-y7MN) 2024/09/17(火)11:06 ID:bX/ekV+z0(1/3) AAS
一見配列を受け渡ししているように見えるけれど、
実際はポインターとして受け渡ししているってことでしょ
215
(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ d70f-6w0d) 2024/09/17(火)11:56 ID:FRc2ySeD0(1) AAS
>>212
__func__ はマクロではないからだと思う。
216: (ワッチョイ ff63-y7MN) 2024/09/17(火)12:47 ID:bX/ekV+z0(2/3) AAS
#include <stdio.h>

char hage[10] = {0};

char *hoge(void)
{
// ++hage; // error '++' には左辺値が必要です。
// return hage;
 return &hage[1];
}

int main(void) {
 char *p = hoge();
 printf("%p, %p\n", hage, p);
 return 0;
}
217
(1): (アウアウエー Sadf-N1Zj) 2024/09/17(火)13:07 ID:TMGdiCOOa(2/2) AAS
>>214
そんなことは判ってるよ
(char hage[10]) で hage++ または ++hage 出来ちゃってる(ように観える)のが問題なんでしょ
関数の引数は (char hage[]) または (char *hage) のみにすれば良かった
(char hage[10]) はどうみても蛇足(結局境界テストされてないし)
218: (ワッチョイ ff63-y7MN) 2024/09/17(火)13:11 ID:bX/ekV+z0(3/3) AAS
問題だと思う人は、使わないようにしましょう
開発サイトでそういうルールを用意するのも手です
219: (スプッッ Sd3f-2MD7) 2024/09/17(火)17:17 ID:9gub94Dsd(2/3) AAS
>>215
納得しました。
220: (ワッチョイ 9ffd-NiVF) 2024/09/17(火)20:17 ID:dLWvmxgr0(1) AAS
>>197
そもそもstr系mem系はアドレスを受け取るんであって配列を受け取る関数ではないっていう勘違いがあるんだけど
それはともかく大きさがどうのとかなんちゃらが都合がいいとか、本当にC言語でなんかプログラムを書いた事あるの?
221: (スプッッ Sd3f-2MD7) 2024/09/17(火)20:58 ID:9gub94Dsd(3/3) AAS
俺は尻より胸派なんだよね。
1-
あと 781 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.013s