C言語なら俺に聞け 147
■ このスレッドは過去ログ倉庫に格納されています
>>4
ちょっとはググって言え。
使い道のないはずのイテレータをC++ではどう活用してるのか、
何故そんなことになるのか、考えてみろ。 というかこのスレワッチョイ外されているんだな。
最近この手の荒らし多いな。
俺はワッチョイ無しのスレは気に入らないから、
>>4の疑問について、ワッチョイ無しのスレ(=このスレ)では答えないことにする。
まあもうヒントは十分に与えたし、馬鹿でなければ辿り着けるはずだが。 イテレータへのこだわりは確かに謎。結局ローレベルな話なんだよね。
foreachという切り口だとイキるのが難しいということか。 ナマポとプログラム言語の関係性はさっぱりわからない アホ? list<T>::iteratorがナマポ撲滅のためとか本気で言ってるのか? 改めて明解C読んだけどどう考えても入門者向けじゃねえなこれ
これ最初に読んだせいで挫折した人多そう その教科書は教師を再生産するための商品
独学でどうにかするアイテムじゃあない
教科書の肝心のところに教師から教えてもらうフェイズがひっそりとしのばせてある
だから教師の関与が深い
補助の人間が必要な物品だよ
教科書を誰が買うかっていうと、先生がより先生っぽい演技・活躍を出来るアイテムを買うだろ
だから教師の再生産をするためのアイテムを教師が生徒に買わせるんだよ
教科書は生徒が買うんじゃなくて先生が買う、
そのフェイズでは教師の介在があってはじめて理解できるようなひっかけがなくちゃあならない、
だから「入門者向けじゃねえ」になる C言語の入門書を読み終えて文法をある程度理解したところなんですけどこの次はどうしたらいいんでしょうか・・・ 何かを作って見る
何を作るかは自分で決める
決められないときは、みんなに相談してみる >>14
アルゴリズムとデータ構造の本を一冊買って勉強しとけ
もちろんコードを書くんだ
コードを書かないならそんな本は買わなくてよろしい >>14
標準ライブラリの関数の仕様を調べつつ、自分で実装してみる printf と scanf のフォーマット処理は勘弁してください ありがとうございますとりあえずアルゴリズムとやらの本を買います だめでしょ。
アルゴリズムイントロダクションがいいよ 事典は事典。最小限の解説読んであぁなるほどねって思える人用。 詳説 Cポインタ、2013、オライリー・ジャパン
ポインターだけで1冊、本が書けるw 引数に配列をとるとき
f(int* data)とf(int data[])の両方が有りだということは分かったのですが、基本的に後者の書き方をしてるコードはほとんど無くて大体前者な気がします。
これはなんででしょうか。後者の方がはっきり配列だとわかります。前者は配列を求められているのかただのint型のポインターを求められてるのか判断つかないと思うんです ポインタ本ならこっちの方がいい
新・標準プログラマーズライブラリ
C言語 ポインタ完全制覇 大型本
前橋 和弥 (著) 2017/12/7 >>24
[ ] は、サイズが変わらない
* は、単なる先頭アドレスで、サイズが変わるかも知れない >>24
配列表記はアドレス表記のエイリアスだから区別するという発想がそもそもない
配列アクセスするコードならアドレスと配列のサイズを引数で渡す 関数の引数としては配列であろうがポインタであろうが、ただのアドレスとしての意味しかない >>29
配列でもポインタでも同じってことは分かってるでしょ
それでも元が配列なら配列で受けたほうが分かりやすいのでは?
という疑問だと思う
>>24
ぶっちゃけ、Cに慣れてくるとどっちでもたいして変わらない
配列で受けたいのならそうすればいい。
実際のところ、両方それなりに使われてる。
例えば、main() は int *argv[] にすることが多いんじゃないかな
多分だけど >>24
配列っぽい表記に惑わされて、sizeofして長さを求めようとしたというバグを何度か見ました。
f(int data[100]) なんて渡し方だと、どう? そんな文法はない。
宣言としては有効かな。でも意味はないだろうね。ただのポインタ。 >>33
じゃあ、これをポインタ表記に置き換えて見てください、お願い >>24
なるほど、じゃあ君は
void swap_int(int lhs[], int rhs[]);
と書いてもらえれば判断つきやすいんだな なんというか、Cならではの問題かな。
Javaもちょっと似てるか。 下のようなコードを書くとコンパイルエラーになるでしょ。
int ary[100];
int val;
val = ary++;
このaryは配列だから、ary自体の値を変化させる操作は出来ない。
それの類推で関数の仮引数はポインタで受けるんじゃないかな。
関数の中でポインタ風に使う変数はポインタの形で宣言。
関数内で値を変化させず [] によるインデクスだけでアクセスするなら
仮引数を配列の形で宣言するのも分かりやすい書き方かも。
後は歴史的な事情。
配列風に書くとインデクス計算に掛け算を使われて遅かった名残り。
>>30 俺はmainの引数は main(int argc, char *argv[]) だな。
保守的だけど、こんな場面で独自色出すことないしね。 >>24
あんたの感覚は正しいと思う
同じだと言ってる奴もいるけど
foo(int a[]){
a = … /* エラー */
とか微妙に違う
ただそこまで気にする人があまりいないだけ 関数の引数では配列の要素数は無視されるだけ
変数としての配列とポインタは別物だけど、関数の引数では全く同じもの 理由は既出だけど、C言語では配列とポインタは明確に違うよ。
相互変換可能なだけ。 ぶっちゃけ、相互変換可能ならその二つは同じじゃねえか?
数学的に 同じ点もあるし違う点もある
同じ点を強調したいときに「同じ」
違う点を強調したいときに「違う」
と言うだけ
具体的に語らないと何の意味もない >>38
そのコード片、エラーになるかな?
仮引数のa(intへのポインタ)に
関数内で値を代入することは許されるはずだけど。 代入ではエラーにならんと思うよ。
lvalueとして使えると思う。配列っぽく書けるがあくまでポインタ。 >>43-44
すまん、お前らの言う通りだ
なんか勘違いしていたみたい 引数の配列がホンモノだとすると、非NULLが保証されてないとあかん。
というか構造体渡しと同様の配列渡しが必要だな。まあ使わんか。 >>37
その例は
void func(int ary[100])
{
int val;
val = ary++;
}
との違いを示そうとしているのだとしたら
int *val; じゃないとおかしいだろ
>>37
[]で書くべきと主張するんなら
char argv[][]にしなきゃねえ
もちエラーだけどw 配列をパラメータにするのは
サイズが決まってる時にそれを明示したい場合くらいだな
ポインタの方が汎用性が高いから 構造体みたいに
値渡しやコピーもあると(たまには)便利 >>50
void func(int ary[100]); これと
void func(int *ary); これが
意味が違うと思っているのか? 設計意図を示すコメント的な意味ならあると思う
中身は同じだけど 初心者に対して誤解を与えるだけじゃね?
必ずそのサイズで呼ばれると保証されるわけでもないし。 >>52
意味は違うね
要素が100個以外の時に前者を使ってるコードを見たら気持ち悪いだろ?
そういうこと
コンパイラによってはary[1000]にアクセスすれば警告が出る ほんとに警告出るのか?
サイズ指定に意味がないというのが規格だし、コメント程度の役割しか持たせたらあかんという気が お高い静的解析ツールだと警告出るかもね。
やってないから知らんけど。
そういう環境で開発できるならコメント以上の意味はあるかも。
仮定で申し訳ない。 >>55
おまえの主観は聞いてない
プログラムの実行結果が違ってくる例を示せ >>48
多次元配列なら
void func(int ary{}[100])
{
}
とか
void func(int (*ary){}[100])
{
} >>61
間違えた
void func(int ary[][100])
{
}
とか
void func(int (*ary)[100])
{
} >>60
もう一度言う、おまえの主観は聞いてない
正論か屁理屈かはおまえの主観だ
客観的事実を示せ、理屈はそれからだ >>63
だれも機械の解釈の違いには言及してない定期 >>62
void func(int ary[][100]); これはできるのに
int func(void)[][100] これはできない
{
int ary[][100]; これもできない
ary = 0;
return ary;
}
extern int ary[][100]; と
extern int (*ary)[100]; は意味が違う
結局、[]で書くべきなんて主張は
通用しないところが多すぎる戯れ言だ >>64
プログラム言語は機械に解釈させるためのものだ
自明なことを誰も言ってないなんてことこそ屁理屈そのものだろうが >>68
機械の解釈が同じでも人間には違う意味に見えるのはあるよな? >>69
void func(int ary[100]); これのどこが
void func(int *ary); これの構文糖衣なんだ?
書いた奴の頭を疑わせる以外にどんな意味があるんだよ サイズが100でなければならない関数なら
void func(int (*ary)[100]); こう書いて
int ary[100];
func(&ary); こう渡せよボンクラ >>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。 >>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。 >>73
ここがム板ってことを忘れたか?
技術的な話で来い 多次元配列の型は typedef で型名作っておけば楽なのでは? >>68
>>76
この書き込みのどこが技術的な話なんだw
単にイキってるだけじゃん。 >>78
構文糖衣の話をしたんだが
構文糖衣と書いてないと読めないオツムなのか?
アホw バカwww >>75
そりゃわかりにくいからだよ。
引数にするとCの多次元配列の嘘くささがよく表れるわ。
せめて構造体で包むとかして名前を付けた方がいいね。 >>70
それを糖衣構文というかどうかどうでもいいけど
だれも機械の解釈の違いには言及してない定期
>>50➡>>52
明示とは機械に対してではなく人間に対してのことを言ってるからこの返信は意味がずれてる 超初心者です。
シミュレーターで動かしながら独学で学んでいるのですが、
scanfが動かない(スルーされる)ので困っています。scanfが動くシミュレーターってあります? for文でこんなのを発見したのです。
for(;;)
ご覧のとおりセミコロンがカッコ内に2つあるだけ。
これはどういうfor文でしょうか。
ググり方も分からないです。 昔からその書き方の無限ループを好む人は多い
俺が知ってる範囲だとカーニハンもその書き方を好んでいた 無限ループって言っても
大概は何かの条件で脱出するわけだから
while (条件) が一番わかりやすいと思う
あ、好みだろうから、反論は不要です >>92
俺も無限ループはwhile(TRUE)派だな。
静的解析で怒られるから使うなって人もいるけど。
これも個人の好みなので反論不要です。 無限ループには
for(;;)
while(1)
while(true)
などがあるようですが、驚いたことにfor(;;)がC言語の伝統的スタイルなんだそうで。 for(;;)は無条件であることを的確に表現してる
条件が書いてないのはこれだけ そういややったことないけど while () はできないのかな?
できたらできたでなんか怖いがw >>100
冷静に考えると、何でfor(;;)の真ん中の条件式のとこ空欄でも正しい構文になるんだろうね。
for以外に条件式省略できる構文ってないよね? ■ このスレッドは過去ログ倉庫に格納されています