C言語なら俺に聞け 152

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウウー Sa4f-7DQ/)
垢版 |
2019/06/17(月) 18:27:10.41ID:3L1/L9kLa
!extend:checked:vvvvv:1000:512
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 151
https://mevius.5ch.net/test/read.cgi/tech/1554171817/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/07/14(日) 23:13:20.84ID:uXkiDi0Ud
>>387
主な原因は順序が決められないことと最適化のためらしい。詳しくは知らん
2019/07/14(日) 23:15:43.21ID:uXqqdpfBM
i = i++;
これの結果が未定義なのは直感的に理解できます。
代入とインクリメント増分の関係が不明だからです。
s[i] = i++;
これの結果が未定義なのは直感的に理解できません。
演算規則に従えば、iはインデックスとしての間接参照でしかないからです。
2019/07/14(日) 23:18:12.85ID:XOVWGW1L0
>>387
左辺と右辺の評価順序は未定義だからだ
gccとclとか違う環境で試してみれば分かる
2019/07/14(日) 23:28:34.66ID:uXqqdpfBM
int x = 2*i + i++;
それでは、これの結果もまた未定義ですか?
2019/07/14(日) 23:55:54.94ID:XOVWGW1L0
iの評価は何回だ?
評価が複数回入る式は書くなということだ
仕事でそんなコード書いたらどやされるぞ
2019/07/15(月) 00:20:47.65ID:wok43DsHM
私は勉強のためにコードを書いています。
コードがどのような動きをするか興味があります。
int a = 1;
int x = (a = a) + a;
それでは、この式ではxは定義されますか?
左辺と右辺の評価順序に関わらず、答えは同じです。
2019/07/15(月) 00:33:43.29ID:mPPf+F39a
されます
2019/07/15(月) 00:46:03.12ID:E9YINa1F0
そんな無意味なコードから何を学ぼうとしているのか分からんわ
2019/07/15(月) 00:55:35.98ID:wne2EA+X0
優先順位や式の評価順が曖昧かもって考えるソース、
書いてて気持ち悪くなりませんか?私はなりますよ。
2019/07/15(月) 01:14:29.35ID:Voexy70f0
>>394
副作用完了点でググってこい
2019/07/15(月) 02:04:55.42ID:wok43DsHM
while((s[i++] = t[j++]) != '\0') ;
元々気になったのは、tをsにコピーするこのコードです。
これを見て、他にインクリメントで簡略化出来そうなコードを考えています。
2019/07/15(月) 02:10:16.53ID:wok43DsHM
for(;t[j] != '\0'; j++){
s[i] = t[j];
i++;
}
s[i] = t[j];
従来の私なら、このようにコードを書いていました。
新しいコードの記述なら1行で書けます。
2019/07/15(月) 02:19:48.51ID:wok43DsHM
while((s[i++] = t[i + 1]) != '\0') ;
そこでtをsに1つずらしてコピーするコードをこのように書けないか考えていたら、未定義の問題が生じました。
私は演算規則から考えてこのコードは上手く働くと思いました。
2019/07/15(月) 03:09:03.53ID:mPPf+F39a
俺はmemcpy使う
性能は知らん
2019/07/15(月) 07:21:57.18ID:ex33LrHm0
せっかくC-FAQのリンク書いたのに…
バカって人の言う事聞かないからバカのままなんだな…
2019/07/15(月) 07:41:01.06ID:Voexy70f0
>>401
「簡略化」とは、何を目指しているんだ?
行数が少ない方がいいとか考えているならバカな考えだからやめとけ。
コンパイラの最適化で同じコードになるような範囲の変形で行数を減らしたところで、可読性を下げてるだけで何のメリットもないぞ。
2019/07/15(月) 08:20:49.21ID:wok43DsHM
私は行数の少なさというよりはむしろ見た目の単純さで読みやすいと感じます。
C-FAQのリンクは事実が書かれているのみで演算規則が無視される理由が理解できませんでした。
2019/07/15(月) 08:32:41.44ID:Voexy70f0
>>407
演算規則って何のことだ?
構文解析や演算子の結合の優先順序と副作用の発生するタイミングはまた別の話だぞ。
2019/07/15(月) 09:10:34.41ID:ex33LrHm0
どうせちゃんと読んでないか理解する能力がないんだろうな…
2019/07/15(月) 09:22:44.79ID:IpJNQ16e0
>>389
それはおかしいだろう
算術プラスの第1オペランドと第2オペランドの評価順序は未規定だぞ
2019/07/15(月) 10:07:24.78ID:Voexy70f0
>>410
未規定の動作がたまたま自分の期待する動作と同じになったということが理解できてないんだろうね。人の話を聞かない相手に何を言ってもダメそうだね。
2019/07/15(月) 10:40:21.72ID:r5uSGSCiM
愛繆私は未定義な理由について理解できません。
なぜなら、演算規則に従い前置インクリメントを代入の評価より先に行えば、389の結果は一つと決まるからです。
しかし、評価順序が未定義となりコンパイラに依存となる理由は何ですか?
この式を定義することによる問題の例を理解したいです。
2019/07/15(月) 10:44:14.06ID:mPPf+F39a
左辺は
2019/07/15(月) 10:45:20.28ID:r5uSGSCiM
つまり、私は未定義と規定されている理由を知りたいです。
定義することで発生する問題の例などです。
2019/07/15(月) 10:49:35.01ID:6m2OA1zn0
この人の言ってる「演算規則」って何なんだろうね。
「C言語 "演算規則"」でググっても、それらしきものは出てこないし。
2019/07/15(月) 10:57:10.32ID:r5uSGSCiM
int i = 0, j = 0;
int x = i++;
int y = ++j;
これです。xでは代入の後に後置インクリメントされます。(x = 0)
yでは代入の前に前置インクリメントされます。(y = 1)

s[i] = ++i + 1;
つまりこの式では代入の前に前置インクリメントされます。(次と等価です、)
i = i +1;
s[i(==1)] = i(==1) + 1;
2019/07/15(月) 10:59:07.47ID:mPPf+F39a
>>414
だから、左辺は
2019/07/15(月) 10:59:28.08ID:r5uSGSCiM
これは、未定義と規定されていますが、理由が理解できません。
私が示した通り、定義することによる問題の例は何ですか?
2019/07/15(月) 11:01:03.87ID:r5uSGSCiM
389の中では、左辺はs[1]です。
なぜなら、代入より前にiが前置インクリメントされます。
2019/07/15(月) 11:01:37.73ID:r7SsHRFS0
i++のポストインクリメントとi+1の評価順が不定だから
2019/07/15(月) 11:02:04.90ID:E9YINa1F0
これ読んで分からないなら諦めろ


未規定の動作とは、複数考えられる動作のうち、どれが実行されるかの要求が課されない動作のこと。
未規定の動作への依存で移植性が低下します。

未規定の動作
・部分式が評価される順序、及び副作用が発生する順序。
ただし関数呼出しの()、&&, ||, ?:, カンマ演算子は除く。(6.5)
・代入演算子のオペランドが評価される順序。(6.5.16)

未規定の動作
http://www.c-lang.org/detail/unspecified_behavior.html
未定義の動作
http://www.c-lang.org/detail/undefined_behavior.html
2019/07/15(月) 11:04:11.05ID:r5uSGSCiM
i++のポストインクリメントとi+1の評価順が不定な理由は何ですか?
2019/07/15(月) 11:07:31.48ID:r5uSGSCiM
i = i++;
これが未定義なのは理解できます。
しかし、389の中で私が示した通り、の定義をすると発生する問題の例は何ですか?
2019/07/15(月) 11:09:44.83ID:ex33LrHm0
未定義な理由?
言語作った奴がそう決めたから
要するに「仕様だから」
そう決めた理由は想像になるけど最適化しやすい(と言うかそうしないと最適化の妨げになる)と考えたんだろうと思うよ
2019/07/15(月) 11:12:06.88ID:mPPf+F39a
>>419
なんで?
その添字いつ評価されんの?
演算子[]の中身だよ
カッコだけどvoid書いちゃだめだよ
426デフォルトの名無しさん (ワッチョイ 17d2-rBUL)
垢版 |
2019/07/15(月) 11:12:37.37ID:3cpTbRIL0
インクリメントは式全体の前か後に実行されるからだろ
式の途中で実行されるとかあるの?
2019/07/15(月) 11:19:52.48ID:r5uSGSCiM
定義すると最適化の妨げになるという理由は、私には反論する知識は全くないので了承します。私は理解しました。
2019/07/15(月) 11:22:41.60ID:r5uSGSCiM
425の中で、書かれているように、実際には、演算規則でsのインデックスは0でした。
私は[]の優先を見落としていましたが、私が述べたかったことは、演算規則の優先で順番は決定できると思うことでした。
429デフォルトの名無しさん (ワッチョイ 17d2-rBUL)
垢版 |
2019/07/15(月) 11:23:12.12ID:3cpTbRIL0
最適化の妨げにはならないだろ
コンパイラー簡単に作れるとかじゃないの
2019/07/15(月) 11:25:19.08ID:b7u0RgVG0
現行のCの仕様に文句があるなら、ANSI?ISO?の仕様策定に参加でもすればいいんじゃね?
2019/07/15(月) 11:29:05.40ID:IpJNQ16e0
>>411
すまん
俺はとんでもない失言をしていて
突っ込まれるの覚悟しておとなしく待ってたんだが
2019/07/15(月) 11:36:42.62ID:ZvCggxzR0
一通り勉強しましたが、次に何をやったらいいのか分かりません!
何も作れません!
どうしたらいい?
2019/07/15(月) 11:38:20.09ID:mPPf+F39a
>>428
そりゃ決定するための規則を作れば決定するけど、めんどくさいじゃん
2019/07/15(月) 11:39:31.38ID:E9YINa1F0
>>432
作りたいものが無いなら無理に作らんでもいいじゃん
2019/07/15(月) 11:40:09.15ID:3cpTbRIL0
>>432
散歩したり 景色を見たり…
昼寝したり 何もしない
そのうちに急に書きたくなるんだよ
2019/07/15(月) 12:05:05.25ID:ex33LrHm0
>>426, >>429
> インクリメントは式全体の前か後に実行されるからだろ
> 式の途中で実行されるとかあるの?
どのように実装してもいい
並列に処理することすら可能
と言うような最適化を妨げないための仕様
2019/07/15(月) 12:24:44.13ID:E9YINa1F0
要するに++,--は混ぜるな危険ってこと
2019/07/15(月) 12:36:46.00ID:IpJNQ16e0
能なしど低脳
2019/07/15(月) 12:47:17.16ID:0wrdUuzC0
>>403
>while((s[i++] = t[i + 1]) != '\0') ;
for(;(s[i] = t[i + 1]) != '\0';++i) ;
これじゃ駄目な理由ってなんだろう
2019/07/15(月) 12:55:44.11ID:wne2EA+X0
評価順序以前にループ条件が直感的に分かりにくい様なコードは書くべきでない
2019/07/15(月) 12:56:34.33ID:14ut6KBx0
for(@;A;B)

この123が全部必要だと思ってるんじゃね
2019/07/15(月) 13:04:03.21ID:Voexy70f0
>>431
こちらこそすまん。>>411>>410宛ではなく>>409宛だった。
2019/07/15(月) 14:30:35.03ID:y88H95dP0
MISRA-C 2004 の100ルールを守っていないソースコードは、読むに値しないw

まず、コーディングルールを5年勉強しろ!w
2019/07/15(月) 14:33:44.55ID:Voexy70f0
>>443
その特徴的な書き方はいつものRuby大好きマンか?
バカなこと言ってないで巣に帰れ。
2019/07/15(月) 15:05:29.64ID:Nn+acajv0
>>443
MISRA なんて鎖や束縛を作りたがる「管理職」の思考法でしょう?なんでそんなものに従わなければならないのでしょうかね
2019/07/15(月) 15:14:40.80ID:mPPf+F39a
ルールはあってもいいけど、MISRAはあれアホだよね。
考えたやつお前はCを使うなよっていう。
2019/07/15(月) 15:25:22.82ID:ex33LrHm0
>>446
どこがアホなのか詳しく書いてみ
2019/07/15(月) 15:26:34.84ID:mPPf+F39a
>>447
rubyが嫌になったってことですか?
2019/07/15(月) 15:28:03.17ID:Nn+acajv0
>>446
あの阿呆なMISRAを制定した人間の種族はなにか、どんな属性か?得意な思考方法、苦手な思考方法は?信条・信念は?
というところには興味があります、そのためだけに MISRA を読んでいたりします
450デフォルトの名無しさん (ワッチョイ 7602-24gz)
垢版 |
2019/07/15(月) 16:02:12.44ID:3UWFYY1V0
>>432
自分が作りたいものを作れ。
作る技術がまだ足りないならそれについて学習したり研究したりしろ。

一つ間違えてはいけないことは、自分の作りたいものを今の自分が持っている技術力で出来る範囲内に無理に収めないようにすることだ。
収めれば実現はたやすいが飛躍はできず本当にやりたかったことには届かない。
2019/07/15(月) 16:06:07.03ID:QcIx6aGf0
MISRAは実際の不具合を分析して作られたいわばバットノウハウ集だけど、言い換えると最低限のバカ避け。
バカがバカな不具合出すもんだからその他の人が迷惑を被る。
ま、バカはプログラム作るなって事だ。
2019/07/15(月) 16:14:22.25ID:y88H95dP0
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006

この研究会は、トヨタなど大企業から、数十人のベテが集まって、
欧州人に聞きながら、完成された本w

未だに、コーディングルールのバイブルだろがw

元々は、Andrew Koenig の本

C Traps and Pitfalls, 1988, c1989
Cプログラミングの落とし穴
453デフォルトの名無しさん (ワッチョイ 17d2-rBUL)
垢版 |
2019/07/15(月) 16:20:24.64ID:3cpTbRIL0
自分が馬鹿だとしっている賢い人はMISRAを使うということか
2019/07/15(月) 16:26:07.09ID:IpJNQ16e0
ブランドにすがるだけで自分の頭で考えないやつは相手にならん
あれ読んでて異論を持つことが全くないやつはその疑いが強い
2019/07/15(月) 16:34:38.99ID:ex33LrHm0
>>454
だからどこに異論持ってるのか書けよ
もしかしてグダグダ言うだけ君なの?w
2019/07/15(月) 16:42:13.17ID:IpJNQ16e0
命令すんな
そもそも自分が書かねえくせに
2019/07/15(月) 16:43:21.75ID:Nn+acajv0
>>452
>この研究会は、トヨタなど大企業から、数十人のベテが集まって、
トヨタってコーディングを製造と言い切っちゃう人たちの集まりでしょう?そんな人たちの考え方って信じていいのでしょうかね…
2019/07/15(月) 16:48:48.65ID:ex33LrHm0
>>456
どうせ書けないんだろ、無理すんなよw
2019/07/15(月) 16:49:33.71ID:ex33LrHm0
>>457
信じるのはダメだと思うよ
内容見て判断しなきゃ
2019/07/15(月) 16:51:54.40ID:Voexy70f0
>>452
お前さんはいつも、有名な誰それがこう言った!とか、なんとかの本にこう書かれていた!とか、他人の発言を字面だけなぞって記憶するだけだから、中身の本質も適用すべき場面も長所短所も理解せずに垂れ流して害悪にしかならないから、もういい加減消えてくれないか?
2019/07/15(月) 17:02:08.44ID:14ut6KBx0
多分MISRAはΣ計画とセットだったんじゃねえの
とするとゾンビだよ
2019/07/15(月) 17:25:49.24ID:y88H95dP0
>>457
日本の研究会の考え方・思想は、ほとんどない!
MISRA-C は、Andrew Koenig の本を参考にして、欧州人が作ったから

日本の研究会は、各ルールの例題を作って、誰でもわかるように解説した。
各ルールは、こういう事を言ってます、という解説書

江添 亮の「C++11/14 コア言語」のみたいな本。
無数の例題を並べて、各ルールを解説した本

だから、この2冊は、神の書と言える!
2019/07/15(月) 17:32:05.00ID:dKUxLoi20
ルールとかくそどうでもよくね
動いて読めればそれでいい
2019/07/15(月) 17:32:21.62ID:IpJNQ16e0
>>458
ブーメラン乙
2019/07/15(月) 17:43:32.93ID:ex33LrHm0
>>464
バカなのか?
俺は別に異論があるとは言ってない
異論があるなら書けよって言ってるだけ
俺に何を書けって言ってるんだよw
2019/07/15(月) 17:46:56.60ID:IpJNQ16e0
>>465
またブーメランかよ、ワンパターンなやつだな
俺はさっき相手にならんと言ったはず
2019/07/15(月) 17:47:07.64ID:biXPcN21d
落ちものゲーム作れたと思ったけど落下処理の度に今表示中のものが上にズレて処理後のが新しく表示される仕組みのせいで目が死んだ
これダメな奴だ
2019/07/15(月) 18:01:17.82ID:ex33LrHm0
>>466
ハイハイ、結局具体的には何も言えないグダグダ君だったなw
2019/07/15(月) 18:41:39.94ID:IpJNQ16e0
煽っても情報は得られない
インタビューの下手な人だな
2019/07/15(月) 19:25:33.92ID:ex33LrHm0
情報持ってない奴からなにか得ようとしてるってか?
心配するなよ、お前に期待なんてしてないからw
2019/07/15(月) 20:06:52.59ID:14ut6KBx0
githubに存在するMISRA適合のソースコードとかどんだけあるんだよ
2019/07/15(月) 20:23:31.95ID:y88H95dP0
そのルールを守らないという、逸脱手続きをすれば、OK

トヨタでも、MISRA-C で採点したら、5/100点(ルール)しか取れなかったとかw
70〜80点は、欲しい
2019/07/15(月) 20:27:21.89ID:QcIx6aGf0
>>472
それはそうなんだけど、逸脱したらレビューと品質記録が必須になるので逸脱しない方向へのバイアスが強くなる。
結果、強制されてるのと同じになっちゃう。
2019/07/15(月) 20:28:56.79ID:dKUxLoi20
ちなMISRAってどんなの?
pdfのリンクはってれ
2019/07/15(月) 20:31:45.40ID:y88H95dP0
例えば、Linux では、関数の冒頭部分に、return がよくある。
冒頭部分で、処理しないものをはじいてしまう

でも、MISRA-C では、関数内で、return は、最後に1つしか使えない。
複数箇所に、出口があってはならない

そのルールを守らないなら、逸脱手続きをすればよい。
その代わりに、点数が下がっていく
2019/07/15(月) 20:32:43.56ID:ex33LrHm0
>>471
ほとんどないんじゃね
>>451が言う通りバカ避けだから
>> 関数は、その最後に1つだけの出口を持たなけらばならない
みたいに適合させようとすると人によってはちょっと書き辛いルールもあったりするし
2019/07/15(月) 20:33:46.38ID:ex33LrHm0
あっ、被ったわ
みんな結構このルールに抵抗あるんだなw
2019/07/15(月) 20:35:21.08ID:y88H95dP0
>>474
「misra-c 2004」「misra-c 2012」で検索して!
2019/07/15(月) 20:37:59.21ID:y88H95dP0
他にも、MISRA-C では、2重ループ内から、一気に脱出できないから、フラグを持ちまわる事になる

このルールも嫌われる
2019/07/15(月) 20:48:48.44ID:y88H95dP0
組み込みとか医療用では、バグると簡単に人が死ぬから、
MISRA-C を勉強していない香具師が、コーディングするとヤバイ!

だから、コーディングできる資格を作るべきだっていう話も聞く
2019/07/15(月) 20:50:33.69ID:dKUxLoi20
なんでルールブックが有料やねんあほか勝手にやってろ
2019/07/15(月) 21:07:10.69ID:IpJNQ16e0
>>476
語るに落ちたな
ブランドvsブランドの対戦成績を
自分の頭で考えないブランド志向なやつに出せるわけがない
2019/07/15(月) 21:19:39.89ID:pdudwpaZ0
>>481
検索したら出てきた
http://www.c-lang.org/detail/misra_c.html
2019/07/15(月) 21:36:18.18ID:r7SsHRFS0
4.12 必要 動的なメモリ割り当てを使用してはならない

って酷くね
2019/07/15(月) 21:47:13.82ID:Xch0qlQL0
俺以外は絶対守れよって思うルールも多々ある
2019/07/15(月) 21:57:44.30ID:ex33LrHm0
>>482
何を言ってるのか自分でもわかってないだろww
ブランドとかバカじゃね
2019/07/15(月) 21:58:24.78ID:QcIx6aGf0
関数の中盤以降からreturnするならともかく、早期returnまでも認めないのはナンセンスだよな。
杓子定規すぎるわ。
2019/07/15(月) 22:00:39.84ID:ex33LrHm0
>>484
組込みだと実行時間が読めなくなるのとフラグメンテーションで総容量足りててもエラーになることがあるからしょうがない
2019/07/15(月) 22:06:28.61ID:IpJNQ16e0
>>486
おまえがすがっているのはブランド以外の何物でもない
とぼけたら誤魔化せると思っているならおめでたいやつだ
2019/07/15(月) 22:43:50.22ID:ex33LrHm0
MISRAをブランドとか言うアホがいるんだ…
まあ具体的な内容には突っ込めないグダグダ君だしなぁww
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況