- 1 名前:デフォルトの名無しさん mailto:sage [2021/12/25(土) 12:11:46.61 ID:xxeaCAplM.net]
- !extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください) C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ C17 www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4713.pdf C11 www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf C99 www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf kikakurui.com/x3/X3010-2003-01.html C FAQ 日本語訳 www.kouno.jp/home/c_faq/ JPCERT C コーディングスタンダード https://www.jpcert.or.jp/sc-rules/ ※前スレ C言語なら俺に聞け 157 https://mevius.5ch.net/test/read.cgi/tech/1624846971/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
- 33 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 09:00:32.53 ID:VTzS4kbc0.net]
- とりあえずfgetsとstrtok_rを使って、
一行まるごと読み込んで、読み込んだ一行分の文字列を空白で分割して表示するだけのプログラムを書いてみたらどうかね
- 34 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 09:38:23.12 ID:AQXYYOVd0.net]
- >>30
俺の地元のルールだと、 22 22 22 ...(25回22を選ぶ) みたいなピックしてkが2だと50ポイントもらえるルールだったから文字列として扱わんといかんかとおもてた
- 35 名前:デフォルトの名無しさん [2021/12/31(金) 11:20:32.87 ID:2Zk/vij+0.net]
- 3[山田、山田、佐藤、田中、・・・]
7[・・・] 12[・・・] というような表を作っておけば良いのでは?
- 36 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 21:31:16.10 ID:AQXYYOVd0.net]
- https://paiza.jp/works/mondai/c_rank_level_up_problems/c_rank_sort_boss
これ教えて
- 37 名前:デフォルトの名無しさん mailto:sage [2022/01/01(土) 00:39:58.19 ID:gOXFnTf60.net]
- 何が分からんかぐらい書きなよ
- 38 名前:デフォルトの名無しさん mailto:sage [2022/01/01(土) 01:18:03.81 ID:1OHQMytp0.net]
- 何がわからんかも分からん
方針もわからん
- 39 名前:デフォルトの名無しさん mailto:sage [2022/01/02(日) 13:30:00.29 ID:o9R7ffl70.net]
- >>35
ソートするだけだよ。 まずは入力を配列変数に貯め込んでそれに対して並べ替えをする。 ソートする部分を自作するのが面倒なら qsort() 使えば良いんじゃないかな。 (この辺はC言語使わない方が楽かも知れないが)
- 40 名前:デフォルトの名無しさん mailto:sage [2022/01/03(月) 21:40:15.76 ID:qalXVoDK0.net]
- 入力データの1行目を読みデータ件数を取得する
データ件数にあわせて配列を確保する (予めMax値の配列を用意するのでも構わない) 2行目から最終行まで順に読み込み、配列に格納する 問題文の財産評価ルールに従いデータをソートする 並び変わったデータを出力する
- 41 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 15:33:37.60 ID:soGE7KAW0.net]
- 文字配列なんですが
char str[] = { 'A', 'B', 'C' }; ↑のstrにはnull文字は付加されないという認識で合ってますか?
- 42 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 15:39:28.79 ID:XZjVJACa0.net]
- ('A')
- 43 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 15:50:14.25 ID:OD+qNx/80.net]
- 付加される保証がない、かも
- 44 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 16:43:04.90 ID:NntPX0Am0.net]
- >>40
合ってる 境界調整の結果として'\0'のように見える 詰め物が入る可能性はあるが騙されてはいけない
- 45 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 16:53:16.90 ID:soGE7KAW0.net]
- >>41-43
そうなんですね ありがとうございました
- 46 名前:はちみつ餃子 mailto:sage [2022/01/06(木) 16:54:16.61 ID:U9j/lfCJ0.net]
- >>40
付加されない。 "ABC" と書いた場合に char 四個ということになるのと違ってその場合には要素が三個の配列と解釈されることが保証される。 つまり str の型を言うなら char[3] ってことね。 ちなみに char str[4] = {'A', 'B', 'C'}; というように書いた場合 (初期化子に書かれている要素が配列の要素数より少ない場合) は足りない分は 0 が補われたかのように動作することが保証されるので str[3] には 0 が入ってる。
- 47 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 17:05:22.56 ID:OD+qNx/80.net]
- 分かって使うのは良いけれど
そのまま文字列処理関数に渡すと 困った事が起きるんだよな
- 48 名前:デフォルトの名無しさん [2022/01/10(月) 23:16:11.54 ID:rD3Qvv+7a.net]
- プログラミングで y = 1 / (1 / x) ってやったらどうなるの?
https://mi.5ch.net/test/read.cgi/news4vip/1641823457/ 1 名前:以下、5ちゃんねるからVIPがお送りします 投稿日:2022/01/10(月) 23:04:17.072 ID:expyRxlYa 頭のいいコンパイラなら y = x にしてくれるのか?(機械語にするとき) あっ、ちなみにインタプリタ言語やLLでは普通に t = (1 / x) を計算して y = 1 / t にするだろうそりゃ うちは自動車メーカーだからな、使ってるのはC言語で、コンパイラは GHS MULTI っていうお前らが知らないコンパイラだよ
- 49 名前:デフォルトの名無しさん mailto:sage [2022/01/11(火) 01:08:21.74 ID:Q8SCQHSH0.net]
- xが整数ならしてくれないよね
浮動小数点数なら if (x==0) y=NAN; else y=x; にしてくれるのかなぁ
- 50 名前:デフォルトの名無しさん mailto:sage [2022/01/11(火) 01:38:43.94 ID:2o/IB+MZ0.net]
- 0除算とかオーバーフローはプログラマが考慮してくれるんじゃないのかな?
- 51 名前:デフォルトの名無しさん mailto:sage [2022/01/11(火) 02:04:19.39 ID:Wr4lWyid0.net]
- gccなら-ffast-mathを付ければy=xになるはず
ieee754準拠なら変形しない
- 52 名前:デフォルトの名無しさん mailto:sage [2022/01/11(火) 08:27:46.21 ID:3vsFi49bd.net]
- 整数型なら0除算が未定義動作だから変な最適化がかかるかもしれん
x==0 で未定義動作 2回目の割り算で x!=1&&x!=-1で未定義動作 signedなら最終的にy=xになりうる unsignedならx=-1がありえないのでy=1になるかもしれん
- 53 名前:デフォルトの名無しさん mailto:sage [2022/01/11(火) 19:52:42.66 ID:pJ1mRDMY0.net]
- 整数前提
カッコついてるから (1/x) まで評価してソレを整数化とり得る値は符号付きで-1,0,1,<0割未定義> その評価値が分母に 分子が 1 の演算で 符号付きで 1,-1,<0割未定義> ほとんど0割未定義を踏みそう
- 54 名前:デフォルトの名無しさん mailto:sage [2022/01/11(火) 20:03:51.62 ID:W/ZD5G+Pd.net]
- 未定義は「相手せんでいい」だからな
- 55 名前:デフォルトの名無しさん [2022/01/15(土) 17:45:56.79 ID:MXtcLzFoa.net]
- ものにもよるがだいたいはダメだな。
printf()で%.3sみたいなフォーマットにするとかstrncpy()で文字数指定するとかなら大丈夫だろうが。何れにしてもプログラマーが意識してないといけない。
- 56 名前:デフォルトの名無しさん [2022/01/15(土) 17:47:19.94 ID:MXtcLzFoa.net]
- ぐはっ
リロードしても出てこなかった書き込みが沢山出てきた
- 57 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 13:28:18.74 ID:E45iSBlB0.net]
- C言語学び始めたんだけど今のところJavaで自動でやってることをCは明示的にやってるって事くらいしか分からん
Cはガベージコレクタが無いからアルゴリズムを学ぶには最適って聞いたんだがいまいち理解できん メモリの確保と解放を任意にできることで他と違って何ができるようになる?
- 58 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 14:08:25.07 ID:H6PAG9rn0.net]
- 何で?
確保した資源を解放するという当たり前のことを 自動でやってもらうことの何がそんなに大事なの? 当たり前のことがどうなっているのか把握するほうが大事だと思うけど
- 59 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 14:13:24.52 ID:3oi0BVHh0.net]
- 別に何も
Cはよく高級アセンブラと言われるくらい低級なもの JavaはVMで動かす高級なもの 高級なものは低級なもので実現されてるのよ
- 60 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 14:24:28.62 ID:H6PAG9rn0.net]
- マジで意味わからん
何が言いたい?
- 61 名前:デフォルトの名無しさん [2022/01/16(日) 15:21:59.54 ID:sWhCnDyn0.net]
- int __cdecl main(int argc, char** argv)
この時二つの引数はどの時点で突っ込まれるのでしょうか? 引数とかって言われてもこのくらいしかわかんないです。 int add(int a,int b){return a+b;} int main(){cout<<add(1,2);} __cdeclあるときはmainの中身が実行される前にmain内にある二つの引数を・・・ すみませんよくわからないので教えてほしいです。
- 62 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 15:47:09.71 ID:3oi0BVHh0.net]
- >>60
そりゃmain()が呼ばれる時だけど 何が疑問なのかよくわからん そのadd(int a, int b)もadd(1,2)と呼ばれた時にaに1、bに2が入る それと同じ >>59 >58は>56への応答だよ
- 63 名前:デフォルトの名無しさん [2022/01/16(日) 15:55:52.82 ID:sWhCnDyn0.net]
- >>61
ありがとうございます。 c++やり始めたばかりで、初めて__cdeclというものに出会い、 main()に引数が指定されるのも初めて見ました。 __cdeclを調べてみたのですが、よくわかりませんでした。 https://docs.microsoft.com/ja-jp/windows/win32/winsock/complete-client-code ここのコードに出てきたやつです。 argc, argvこの二つにはどこから来た値がどのタイミングで入るのかがよくわかりません。 サーバー側の方でそれぞれの構造体や関数は一応ですが、調べました。 (ディスクリプタが良くわかんなかったけど部品の形状みたいな感じで覚えました)
- 64 名前:デフォルトの名無しさん [2022/01/16(日) 15:57:48.95 ID:sWhCnDyn0.net]
- main関数が一番最初に読み込まれる関数という風に思っていて、
includeやdefineを済ませた後に一番最初にmainが実行されるのなら、 argc, argvこの二つの変数の値がどうやって決まるのかわからないのです。
- 65 名前:デフォルトの名無しさん [2022/01/16(日) 16:00:01.63 ID:sWhCnDyn0.net]
- 今更なのですが、mainを実行するときにmainの中の
ローカルな空の変数(?)を宣言するだけ宣言しといてるとかですか?
- 66 名前:デフォルトの名無しさん [2022/01/16(日) 17:07:18.79 ID:rX32u5GR0.net]
- >>63
OSから引き渡される。普通はコマンドラインの引数をシェルが加工して渡してくる。 OSのない組み込みのようなやつの場合はそのmain()を呼び出すプログラム次第になる。
- 67 名前:デフォルトの名無しさん [2022/01/16(日) 17:11:54.22 ID:rX32u5GR0.net]
- >>64
何を疑問に思っているのかよくわからないが、Javaとか他の言語とほぼ同じでmain()に限らず関数は呼ばれたらそのブロック内でローカル変数のメモリを確保する。(ただしCの場合は宣言だけだと初期化されない)。
- 68 名前:デフォルトの名無しさん [2022/01/16(日) 17:30:57.83 ID:sWhCnDyn0.net]
- >>65
ありがとうございます。 OSからもらってくるのですね。 謎が解けました。
- 69 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 18:32:43.61 ID:E45iSBlB0.net]
- >>57
>>58 自分でメモリの確保と解放を行う事でメモリの仕組みを知れるのは大事なのは分かる ただgcが動かない事でアルゴリズムとどう繋がるのかがイマイチ分からん 連結リストはメンバを参照して動的配列実現してるけどgcは関係ないと思う gcが動かない事で何かメリットないん?
- 70 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 19:07:47.21 ID:8yj7aXgd0.net]
- 純粋にアルゴリズムを学ぶことが目的ならC以外のぬるい言語のほうが良いのでは?
ただ、考えたアルゴリズムを誰よりも早く動かしたいならCは役立つと思うよ
- 71 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 20:55:00.02 ID:qRjB4bc50.net]
- 純粋に、なら pascal でしょう…
pasca から C へは機械的に書き換えられるから C でもいいでしょうが それ以上の高級言語になると、例えばソートアルゴリズムの「インプレイス」の概念も有耶無耶になってしまうので、初等アルゴリズムくらいは C で勉強したほうがいいですね
- 72 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 20:57:35.96 ID:YLrls7710.net]
- メモリーリークなどは、痛い思いをしてでも学ぶ価値はあると思う
根性論ですまん
- 73 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 20:58:56.40 ID:uYZKVP770.net]
- >>68
プログラマの望むタイミングでGCができるというメリットがある GCが動くとどうしても遅くなるので その遅くなると時をプログラムで決めることができる
- 74 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 23:05:47.94 ID:YLrls7710.net]
- 確保と解放はDB扱うときにもあるからね
- 75 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 00:45:04.90 ID:VBYSAUJW0.net]
- rustがCの代替になる理由がメモリ関連のバグが減るからってのはどう言う事?
- 76 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 00:56:25.55 ID:jU2WrI4n0.net]
- オブジェクトは複雑に依存関係が出来る場合もある。
参照 (C 的に言えばポインタ) が残っているのにオブジェクトの寿命が尽きていればダングリングが生じてしまう。 C では寿命の管理をするのはプログラマの責任であって、無効なポインタを使った結果は未定義。 そういうのを静的にチェックしてエラーにしてくれたらありがたいなぁというのを実現したのが Rust 。 そのかわり制約の記述がちょっと面倒くさくはあるんだが、どちらにせよ依存関係の管理は C でもやってたことではあるからね。 Rust で制約を書けないようならたぶん C でもちゃんとメモリ管理できてない。
- 77 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 02:01:49.66 ID:4l2NkMK40.net]
- Ubuntuのgcc9で
size_t i = -100; printf("%ld\n", i); // -100 と出力されたんですが、なぜsize_tで負数が扱えるんですか? stddef.hでは typedef long unsigned int size_t; になってました 怖いです
- 78 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 02:09:51.98 ID:jU2WrI4n0.net]
- >>76
扱えていない。 printf の書式指定と実際の型に不整合がないようにするのはプログラマの責任で、 それができていないときにどういう挙動になっても知ったことじゃない。
- 79 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 02:13:20.92 ID:4l2NkMK40.net]
- >>77
printfですかなるほど
- 80 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 02:32:10.74 ID:4l2NkMK40.net]
- >>77
あと size_t n = -100; if (n == -100) { puts("-100"); } これが真になるのは-100がsize_tに暗黙的にキャストされてるせいですかね
- 81 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 06:34:55.39 ID:J3jxIzMN0.net]
- >>68
gcって思考放棄だろ 資源管理の中でメモリだけ後片付けを特別扱いできたからって何ってこと 資源管理にはアルゴリズムがいらないと思うのか?
- 82 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 08:24:31.68 ID:y6/SFoBh0.net]
- >>76
-100は32bit 2の補数表現で0xFFFFFF9Cになる。 これはunsigned longで4294967196に相当し、符号なしのiにはこの値が入ってる。 ただprintfの指定が%ldと符号付きになってるので0xFFFFFF9Cを符号付きで表示したらやっぱり-100になる。 >>79 -100がsize_tに変換されるのではなく、どちらの値域も含めることができるように両辺がlong long intに拡張される。
- 83 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 08:24:40.15 ID:6BYLlYWJd.net]
- >>79
signed longかsize_tかどっちかに暗黙的にキャストされる -Wallすると警告出るだろうけど
- 84 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 13:06:53.33 ID:RA8YXgQS0.net]
- サイズがおっきい側にあわせて拡張されるけど
拡張の際に符号付で拡張されるかは、拡張される側の型による でいいのかな? 左辺が size_t で 右辺が (__int16)-1 と (unsigned __int16)0xffff とで変わってくる
- 85 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 19:03:14.06 ID:4l2NkMK40.net]
- >>81
なるほど、わかりました ありがとうございます >>81-83 比較の計算のために型を合わせるってことですね 納得しましたありがとうございます
- 86 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:09:27.93 ID:VBYSAUJW0.net]
- >>80って>>57?
よく分からん話し方が似てる
- 87 名前:デフォルトの名無しさん mailto:sage [2022/01/18(火) 07:11:42.98 ID:gNdHIxeHd.net]
- おまえさん、匿名掲示板に向いてないな
- 88 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 11:09:59.27 ID:3tZE3jDgH.net]
- #defineの効果を全体に適用させる方法は無いの?
書いてあるヘッダを取り込まなくても
- 89 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 11:14:24.09 ID:hwIlnS+y0.net]
- コマンドラインで指定
- 90 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 14:48:47.15 ID:n7chvAG30.net]
- >>87
ヘッダに書かないメリットは何? 暗黙の効果があると全体の見通しが悪くなるだけだと思うんだが
- 91 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 16:57:56.31 ID:JLPh4iSLd.net]
- gcc -DUNKO
とかでコンパイル時分岐させるのはよくやる これで "#define UNKO" 相当
- 92 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 17:35:43.55 ID:JsGuh7u5K.net]
- >>90
細かいツッコミだが、 > これで "#define UNKO" 相当 "#define UNKO 1" 相当な
- 93 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 18:12:26.02 ID:Eie73JRu0.net]
- この問題なんで答え0なん?
難しいhttps://i.imgur.com/TelzwbB.jpg
- 94 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 19:26:05.14 ID:8odJS2DdM.net]
- %rbp の値を pushq でスタックに退避して他の処理をやって popq で下ろしてきてるから最初に入ってた 0 が出てくる
- 95 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 19:30:17.07 ID:6OdGtD3E0.net]
- >92
なんか80286〜80486時代に見たアセンブラと違うorz 適当にググった予想 ;レジスタ %rbp、%rbx の値をスタックにコピー pushq %rbp pushq %rbx ... popq %rbx popq %rbp ;コピーしておいた値を%rbx,%rbpに戻す 呼び出し前と同じ値になるだけだね。
- 96 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 00:21:23.88 ID:3gUGA9pL0.net]
- >>92
0の入った%rbpをpushqして最後にそれをpopqして%rbpに戻しているから。 pushq, popq の数は合っているので他の値にはならない。
- 97 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 06:05:07.87 ID:mAmuRLc0a.net]
- >>89
ライブラリの中なんで書き換えるのはちょっと
- 98 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 06:13:28.12 ID:mAmuRLc0a.net]
- マイコン系のやつでヘッダのインクルードする前に
マクロ定義すれば使うピンを選択できるようになってるはずなんだけど 当然ながら別にコンパイルされるソースの中には効力がないと
- 99 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:37:29.62 ID:hGKgCtXH0.net]
- 「マクロ定義すれば使うピンを選択できるようになってる」メーカー提供の何かを使った
自前のライブラリで なんとかしたいと? それライブラリの設計ミスじゃね?
- 100 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 12:31:56.24 ID:90hTt9580.net]
- 日立の悪口はやめろ
- 101 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 06:37:18.36 ID:Li0julahd.net]
- ライブラリはコンパイル済みだから#defineしても無駄だろ
- 102 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:09:47.27 ID:iLK8Wqk90.net]
- >>75
Rustは間違いがあるとコンパイラが色々指摘してくれる点でいいよね 例えばこの部分にこういうメモリの安全でない使い方をしていますよ、とか ここにこんなデータ競合が発生していますよ、とか
- 103 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:32:17.82 ID:Ppmaq+BpM.net]
- メモリ管理って言っても大層なことしないけどな
単一コンテキストなら対照的にctr/dtr置けばいいし、複数コンテキストならリンクリストに繋いでrefget/refputでいいし まあメモリ上限やフラグメント、メモリプールとかやり始めるとなかなか面倒になってくるけど…
- 104 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:10:17.71 ID:z6fCP1j50.net]
- Cのサーティファイ3級の問題集で
int main(void){ int i,j; for(i=3, j=10;i-->0 && j-->0;); printf("iは%d.jは%d\n",i,j); return 0;} でiが-1 jが7になるのはどうしてでしょうか?
- 105 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:34:45.68 ID:4bRyoani0.net]
- >>103
i-->0 && j-->0が偽になるのはi==0, j==7のとき iはi--で-1になってjの方は短絡評価でj--が評価されずにj==7のまま
- 106 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:37:25.63 ID:94PZZUq60.net]
- 課題や問題としてはアリなんだろうけど、こういうコードはキモいよなぁ
- 107 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:41:05.71 ID:R08bxH5q0.net]
- ルールを知ってるか?という問題に
実用上どうのと言ってるやつ わからんから負け惜しみにしか聞こえんぞ
- 108 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:44:03.93 ID:zNP9VNXb0.net]
- 条件に副作用がある式を書くと糞コードになるよ、って例かな
- 109 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:48:11.38 ID:z6fCP1j50.net]
- >>104
ありがとうございます!大先輩! _(._.)_
- 110 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 21:49:35.56 ID:R08bxH5q0.net]
- 関数ポインタを使っただけで糞コードと言い出すやつと変わらんな
- 111 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 22:02:05.94 ID:iLK8Wqk90.net]
- 偶然だけどRustがCから唯一受け継がなかったのがfor(;;)文と前置/後置の++と--だね
Rustではfor(;;)の代わりにもっとわかりやすいイテレータを使うfor inになって イテレータ利用で++と--を使う場面が激減したため +=1と-=1で十分となった
- 112 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 08:19:14.30 ID:1WN6znb60.net]
- #include <stdio.h>
void main(){ int a[5]; printf("%d\n", &a[0]); printf("%ld\n", &a[1]); printf("%d\n", &a[2]); } 結果: 1860819792 140735054207828 ←★ 1860819800 1860819796になるところがprintfで%ldにすると★のようになりました。どうして?
- 113 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 08:40:51.15 ID:hGoB7Zi60.net]
- %dはint、%ldはlong
LP64環境(Linux等)なのだろう ってか、ポインタを%dや%ldで出すのが変なんだけどね %pで出しましょう
- 114 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 09:28:40.94 ID:Fupo2oO/d.net]
- 挙動がわかっててやるのはともかく
なんで?になるのはギルティだな 担当教官が
- 115 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 11:12:04.00 ID:HehBpiSx0.net]
- ++は、アセンブラコードを意識していると思うよ
- 116 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 12:53:54.43 ID:cK3g3Gve0.net]
- >>114
大昔はコンパイラが直訳だったからね 今はコンパイラが賢いからx++でもx+=1でもx=x+1でも同じ結果 さらにアセンブラ側もレジスタを介すinc命令ではなくメモリ上に直接add 命令で1加算とか そもそもポインタの++なら対象の型が8/16/32/64bitに応じて1/2/4/8をaddとか だからアセンブラは今は関係ないし言語としても++がなくても影響なくなってしまってる
- 117 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 07:31:33.24 ID:Tsd33EHWd.net]
- ポインタから次々読んでいく場合
a=*(p++); のほうが便利
- 118 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 07:43:00.03 ID:y3i0lS6h0.net]
- 格好つけるダサいやつ
- 119 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 08:12:12.92 ID:LR3qN1W70.net]
- 一種のイディオム化しているがふつうその括弧はつけないな。
- 120 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 08:17:06.42 ID:2Fs3iqwoM.net]
- まあ、あっても悪さしないし心配なら付けるのは正しいと思う
>>118の言う通りよく見るイディオムになってるので違和感はあるけど
- 121 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 08:25:24.42 ID:D0DTDHxMd.net]
- char *src, *dst;
while(*dst++=*src++); みたいな書き方はよく見るけど 最適化とか存在しない古いコンパイラのための書き方だよなといつも思う
- 122 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 09:16:27.33 ID:grc2q108d.net]
- いい意味の面倒くさがりだよ
- 123 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 09:23:04.37 ID:Tsd33EHWd.net]
- 最適化だけの問題ではないぞ
while(*dst=*src){dst++;src++;} では変数名を変更する必要が出た場合2ヵ所づつ書き換えねばならない →ミスにつながる それにループが終わった後でdstとsrcは最後の要素を指しているので余計なインクリメントが要るかもしれない
- 124 名前:デフォルトの名無しさん [2022/01/28(金) 11:00:14.06 ID:yXxqNK5h0.net]
- 初心者や他言語ばっかりやってた人の誤読回避は考慮する?
- 125 名前:デフォルトの名無しさん [2022/01/28(金) 11:17:11.26 ID:udo1auGz0.net]
- この頃発見した printf() のフォーマット
% の後に # を付けると x 変換の時に頭に 0x を付けてくれると知り、早速こう書いてみた。 printf("%#x\n", 0xab); 0xab が出力される。 これはいい、と思い16進4桁出そうとしてこう書いた。 printf("%#04x\n", x); すると 0x は付いたがその後が2桁になった。どうやら 0x の部分の桁数も含めなければいけないようだ。仕方がないのでこう書き直す。 printf("%#06x\n", x); やった!できた! しかし幸せは長くは続かない。やがて x に 0 が入った状態でここを通過。以下の出力を得る。 000000
- 126 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 11:22:43.44 ID:dRbZojn90.net]
- Cは初心者向けではないし、可読性は考慮していない
やりたい
- 127 名前:魔さっとコード化出来る人に向いている言語 []
- [ここ壊れてます]
- 128 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 12:25:59.28 ID:6cofCgvGM.net]
- >>124
そんなフラグ初めて見たけど、仕様見たら確かに0以外の時に0xを付加するんだな いまいち使いづらい
- 129 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 12:32:45.35 ID:obJ/SPWt0.net]
- 文字列のエスケープシーケンスでバイナリ直接したんだけど、例えば"\x10"の後に"a"という文字を続けようとして"\x10a"って書くと値が大きすぎるってエラーになる。
"\x10" "a"と分割するしかない?
- 130 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 12:35:51.06 ID:grc2q108d.net]
- Cはプログラマを信頼する言語だ
悪いことをさせない制限より 自由度を優先させている 怠けるやつより進歩する者を優先するのもしかり
- 131 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 13:19:26.12 ID:vyOOr9LZM.net]
- >>127
> "\x10" "a"と分割するしかない? それしかなさげ 8進表現は最大3文字となってるから "\0123" は '\012' と '3' になるけど16進表現には桁数の制限がないので "\x10a" を1文字に解釈しようとしてエラーになる char * の文字列は2文字、wchar_t の文字列は4文字までにすればいいと思うんだけど
- 132 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 13:57:54.02 ID:obJ/SPWt0.net]
- >>129
ありがとう。やっぱりそうなのね。 ESCシーケンスが書きにくくてしょうがないわ。
- 133 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 16:18:28.78 ID:hT9TavA00.net]
- >>127,129
マイクロソフトのドキュメントにも言及があるのを見つけた。 https://docs.microsoft.com/ja-jp/cpp/c-language/octal-and-hexadecimal-character-specifications?view=msvc-170 不格好だけど C はそういうもんだからしょうがないね。
|

|