C言語なら俺に聞け 157

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 0345-kMi9)
垢版 |
2021/06/28(月) 11:22:51.50ID:so+vl3vs0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
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/

※前スレ
C言語なら俺に聞け 156
https://mevius.5ch.net/test/read.cgi/tech/1601271690/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/08/09(月) 18:05:14.63ID:WWM043YB0
ループを制御するための式だから制御式というんだろうけど、

制御式のなかで
例えば

while(i++==10)

なんて出来たとしてもそんな書き方しないだろうし
2021/08/09(月) 18:20:08.88
>>314
while 文なら時々します
https://ideone.com/9Tkokb
2021/08/09(月) 18:26:16.77ID:S8n0VVLE0
>>314
昔は
while((*dst++ = *s++) != '¥0');
とか定番だったけどね
2021/08/09(月) 18:40:40.16
>>316
ノンノン!
while (*des++=*src++)
;
2021/08/09(月) 20:27:51.00ID:eF2Q2UUf0
>>313
勝手にレビュー落ちてろ
俺らには関係ない
2021/08/09(月) 20:56:50.79ID:CmP62z0OM
while(i++!=10)
なら、あるかも
2021/08/10(火) 01:18:25.50ID:7+xjomdk0
プログラミング言語C 第2版 (いわゆる K&R) に載っているくらいなので C では珍しくないのは確か。
日本語版の 129 ページあたりに「こうした慣用法はマスターすべきである」と書いてある。
2021/08/10(火) 01:22:24.66ID:wjw1gmPx0
K&Rは古典なので現代において参考にするようなものではない
2021/08/10(火) 02:16:48.33ID:7+xjomdk0
あらたに書くときに使うべきではないと思うけど古いコードがあるのも現実なんやで。
2021/08/10(火) 11:49:11.43ID:9wi/dlAk0
++, -- は、バグが多いから、Ruby から排除された

Go でも、単独文でしか書けない。
組み合わせることができない

これらを組み合わせると、MISRA-C 違反。
MISRA-C に則っていないものは、製品レベルとして使えない

Andrew Koenig のC Traps and Pitfalls「Cプログラミングの落とし穴」、
組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、2006、MISRA‐C研究会

こういう本を読んでいないだろ
2021/08/10(火) 12:28:40.74ID:MOslRoWuM
書いてはいけないが、読める必要はある。
目を背けるな
2021/08/10(火) 12:38:24.67ID:PfQcBK0N0
「おやつは300円以内」のようなくだらねえことが延々書き連ねてある
ツッコミどころ満載なやつ馬鹿馬鹿しくて相手してらんね
2021/08/10(火) 15:45:47.63ID:21u4vH9ca
>>324
いろんなスレでNG推奨と言われてることから目を背けている奴に何を言っても無駄だろう
2021/08/10(火) 15:51:29.27ID:Ix5h21qC0
マ板でぼろぼろに言われてますが、
このコードは何が悪いのでしょう

https://wandbox.org/permlink/JQc6ZwNrcNThSfkY
2021/08/10(火) 15:52:38.52ID:PfQcBK0N0
プログラミング以外のところでも「俺様が知らない言葉を使うな」という痛いやつがいるのと同じ
2021/08/10(火) 15:54:17.27ID:PfQcBK0N0
>>327
IOCCCのルールを守っていないからだろ
2021/08/10(火) 18:42:13.96
テステス
2021/08/10(火) 18:45:30.07
>>327
何をやっているのか努力しないと読めないのが辛いです、そういう曲芸を仕事でやられたらボロクソなのも仕方がないとおもいますね
2021/08/10(火) 18:58:54.35ID:98gOzHW9d
>>327
型キャスト使わなくても型を合わせばいいのに。
ループ変数がcharってありえないでしょう。
2021/08/11(水) 08:41:39.44ID:19rzwYjH0
doubleでfor回したりはするね
2021/08/11(水) 10:26:21.33ID:fvD2fRTR0
>327
単純にソースの目的がわからない。
バイトオーダ(エンディアン)の確認?

{{ ... }/*コメ*/}というコーディングもなんかキモイ。
2021/08/11(水) 13:02:40.93ID:c2ypq8+M0
レスありがとうございました。

>>327は、

https://medaka.5ch.net/test/read.cgi/prog/1625843192/

というスレで、初心者の1が質問を投げるとこから始まります。
入力された文字を逆順で表示したいという内容です。
それで1が貼ったコードを巡り、いつしか省力化の流れになって、
そして投下されたのが>>327です。
2021/08/11(水) 13:57:42.27ID:EWMgwFeS0
なるほどなあ
とりあえず文字列としてしか使われない領域に意味ありげにint配列使ってるのと、バイトオーダーに依存している、の2点が最大のクソポイントか
2021/08/11(水) 16:04:17.52ID:fvD2fRTR0
>334
>{{ ... }/*コメ*/}というコーディングもなんかキモイ。
Chromeのせいか?
なんか変な文字化け(変換?)起こしてるっぽい。

>char len,i;
が char len、i; ってなるとか。
FireFoxで開いたら正常表示された。

>335
>入力された文字を逆順で表示したいという内容です。
把握

>327
>Stdin
>abcdefg
7文字ってことは

>printf("%c%c%c%c",...
の最初のループの1文字目は "\0"が出力されてるのかな?それでいいのか?
int t[25];が0クリアされてるならいいけど、
ゴミが残ってると正しく表示されないんじゃないか?
2021/08/11(水) 16:25:45.76ID:91mms/zJ0
バイトオーダー決め打ちなのと
sizeof(int) == sizeof(char) * 4 前提にしつつ 4文字づつパックで処理してる工夫なんだろうけど

わざわざ難しくしてってのおふざけ暴走が生んだ結果だな
339デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/12(木) 04:13:22.60ID:zN4hKecF0
>>327
それって入力した文字をただ出力したいだけ?
なんでそんなに複雑に書いたの?
340デフォルトの名無しさん (ワッチョイ 13ad-E1rX)
垢版 |
2021/08/12(木) 04:15:08.28ID:zN4hKecF0
あ、逆順に出すの?それにしても複雑怪奇だなあ。どうしてそうなった?
341デフォルトの名無しさん (ワッチョイ 13ad-Z6Ah)
垢版 |
2021/08/12(木) 06:20:29.21ID:zN4hKecF0
>>335
そっちのスレにまともなやつのURLを貼っといた。
2021/08/12(木) 07:41:49.84ID:+O9ZyhRw0
わざと複雑怪奇に書く遊びはC使いの古来の文化だよ

有名サイトだけど
https://www.ioccc.org/
2021/08/12(木) 15:37:03.65ID:s+UN3BdM0
i>-1 は、i >= 0 の方が、分かりやすい
2021/08/12(木) 16:26:35.93ID:qgQ8hJHG0
char型のiをわざわざintにキャストしてるのは何か理由があるのか
最初からintでiを定義しておけばいいのに
2021/08/12(木) 17:14:43.67ID:s+UN3BdM0
8ビットを、32ビットに変換するのは汎整数拡張

実際のCPU でも、8ビットでは処理できないので、
32ビットに変換してから処理して、8ビットに戻す

つまり汎整数拡張は、ほぼ無害
2021/08/12(木) 17:48:37.78ID:iQcpjp5R0
INT07-C. 数値には符号の有無を明示した char 型のみを使用する
https://www.jpcert.or.jp/sc-rules/c-int07-c.html
347デフォルトの名無しさん (ワッチョイ 49a6-NW/4)
垢版 |
2021/08/12(木) 19:28:25.65ID:PwkehoUJ0
処理系によってcharがunsignedだったりするから
ライブラリのポーティングでえらい目にあったりするのよね
2021/08/12(木) 20:05:44.88ID:s+UN3BdM0
MISRA-C でも、単なるchar 型は使用禁止。
-128〜127 か、0〜255 か、どちらか分からないから

signed char か、unsigned char を、明示して使わなければならない。
または、int8 か、uint8
2021/08/12(木) 20:13:25.34ID:+O9ZyhRw0
信者以外には全く何の関係もないことだな
2021/08/12(木) 23:08:22.05ID:hI2dv5iP0
信仰しなさい。
2021/08/12(木) 23:18:10.25ID:qgQ8hJHG0
char「我をたたえよ」
「チャー!」「チャー!」
2021/08/12(木) 23:20:40.68ID:iqzxJUR40
やっぱりプログラム板は勉強になります
2021/08/12(木) 23:22:37.60ID:ZBXe4sG30
あれは「チャー」って叫ぶのか?「キャー」じゃだめなの?
2021/08/13(金) 01:00:42.90
「シャー」が正解です…
355デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/14(土) 01:39:23.05ID:Znm3fqvr0
きゃら
2021/08/14(土) 16:41:42.16ID:r/g27g8Q0
ヒャル
2021/08/14(土) 16:51:07.63ID:xM4RG8+90
語源というか原形は character でその綴りを縮めたのだと考えれば、
(そしてあえて発音をカタカナに当てはめようとするのであれば)
キャー、もしくはキャラが順当なんじゃないかな。
358ハノン ◆QZaw55cn4c
垢版 |
2021/08/14(土) 19:03:43.32
欧米人なら letter を使いそうなものを、それを character(=象形文字系統)としたその心が知りたい‥‥どうでもいい話ですみません
2021/08/14(土) 20:55:06.51ID:kmQRiZG00
characterはcharと略せるけどletterは略せないとか?
一文字でも縮めることにやっきになってたみたいだし

charは「きゃら」だけど、enumを「いなむ」って言っちゃう
enumerateは「あにゅむれい」なのに
2021/08/14(土) 21:43:24.21ID:g6ShE1m2M
アニメで良いよ
361デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/14(土) 22:34:56.70ID:Znm3fqvr0
性格,性質,気質,特質,特性,特色,人格,品性,高潔さ,正直さ
2021/08/14(土) 22:38:05.04ID:io8zq2Gb0
むこうの語感的にletterだとアルファベットだけで数字とか記号を含めないかもしれない
363デフォルトの名無しさん (ワッチョイ 4d85-/ojN)
垢版 |
2021/08/14(土) 23:51:39.71ID:lbIZmRLc0
>>358
letterだとletになりそうだから嫌ったんだろ
2021/08/15(日) 00:01:55.60ID:oR5NZ4bd0
いっそのこと単に byte とでもしておけばよかったのかもしれない。
2021/08/15(日) 00:05:31.44ID:U+FsjVqC0
>>362 が正解
>>363 は単なるバカ
2021/08/15(日) 00:25:17.76ID:ftNChFXo0
>>364
char8_t ですね

bool が int も無駄が多い
2021/08/15(日) 01:04:08.98ID:lrNh9u+Sa
歴史的に char と byte はどっちが先なのかな
2021/08/15(日) 04:44:19.93ID:Jy6PA5Os0
英語圏でもチャーだけどな
ググればすぐわかる
369デフォルトの名無しさん (アウアウウー Saa5-ZsKU)
垢版 |
2021/08/15(日) 06:15:17.61ID:FL52AdfHa
https://eow.alc.co.jp/search?q=char

焦がす。
370デフォルトの名無しさん (アウアウウー Saa5-ZsKU)
垢版 |
2021/08/15(日) 06:18:12.36ID:0d93Uofwa
char siu

チャーシュー
2021/08/15(日) 16:55:39.88ID:76TevYyAa
>>368
もうずいぶん昔だけど「キャラクター」とか「インテジャー」とか省略しないで呼んでたぞ
今は「チャー」なんか
2021/08/15(日) 17:59:18.88ID:oR5NZ4bd0
>>359
enumerate の頭の音はグーグル翻訳だとエに近い発音に聞こえるけど
weblio だと明瞭にイに聞こえる。
2021/08/15(日) 19:39:25.14ID:Jy6PA5Os0
>>371
英語設定でググってみるといいよ
チャー派とカー派がいてチャー派が優勢のように見える。
reddit見るとお前ガンダム見たことないんか?シャーーー!とかlisperが混乱するだろがってコメントがあってワロ
2021/08/15(日) 19:58:39.32ID:l+/QmNzh0
care派も結構いるっぽいが
375デフォルトの名無しさん (アウアウクー MMb1-9nCG)
垢版 |
2021/08/15(日) 21:05:49.36ID:g44nIVaSM
プログラムを書くのに読み方なんて意味が通じればどっちでもいいやん
2021/08/16(月) 00:02:13.11ID:r0BCUeQy0
初心者です、stdio.hの保存場所が知りたいです

Visual Studio Communuty 2018を使っており、標準ライブラリはインクルードディレクトリに指定された場所にあるということでした
プロパティでインクルードディレクトリを確認したところ、以下のようになっていましたが意味が分かりません
$(VC_IncludePath);$(WindowsSDK_IncludePath);

変数になっているようですが、どこかで確認できるのでしょうか?
377デフォルトの名無しさん (アウアウウー Saa5-PlbL)
垢版 |
2021/08/16(月) 00:13:21.48ID:x3HJsFala
間違っていたらごめんなさい

その $() で囲まれた文字列をコマンドプロンプトから
echo %文字列%
として表示される文字列はどうでしょう
2021/08/16(月) 00:14:50.67ID:wg/zbZxl0
その値のところをクリックして<編集...>を選べば評価された値が見えると思う
その画面の右下の「マクロ>>」ってボタンを押せば使われてる変数の値も見える
上の構成がDebugかReleaseかで値が違う変数もあるけどIncludePathはたぶん同じ

2019で確認したから微妙に違うかもしれない
2021/08/16(月) 00:19:13.32ID:x3HJsFala
echo で確認する方法は、その環境下でなければ
なので、別にコマンドプロンプトを起動してではダメですね
2021/08/16(月) 00:21:12.34ID:r0BCUeQy0
>>378
>>379
ありがとうございます、確認できました!
Visual Studio実行環境でこれらの環境変数が追加されているイメージなのですね
2021/08/16(月) 00:23:50.80ID:x3HJsFala
2021/08/16(月) 00:29:55.90ID:sQwoI9K70
VSインストールすると環境変数セットするバッチファイルが入って来たと思うが、今は違うのか?
古い知識で済まん
2021/08/16(月) 04:32:44.78ID:pMWrjH7B0
てすてす
384デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/16(月) 10:19:54.49ID:sZNsU9Vp0
すてすて
2021/08/16(月) 14:57:58.88ID:Gh+OcB3lF
実は VisualStudio は初心者向けじゃない
2021/08/16(月) 20:10:17.02ID:BeGCPKkC0
visual studioが覇権取ってからプログラミングが嫌になりました・・・
プログラミングが嫌というかvisual studioの設定とか使い方とかそういうのを覚えるのが・・・
LSI C+メモ帳で良かったのに・・・
2021/08/16(月) 20:17:22.96ID:sQwoI9K70
LSI C(試食版)は16ビットコンパイラでしかもSmodelしか作れないから
64ビットWindows環境で動かすのは無理じゃない?
2021/08/16(月) 20:37:48.81ID:4H+7uDzk0
……Visual Studio Community 2018なんてあったっけ?
2021/08/16(月) 20:41:26.98ID:1MUZwyiI0
vs2019 と cuda の相性が悪かったが治ったのなら起こしてくだしあ
2021/08/16(月) 22:55:54.30ID:r0BCUeQy0
素朴な疑問でprintfでdouble型を表示させようとしたとき%lfでなく%fにする理由なんですが、
floatを引数とするとdouble型にキャストされるので、printfではfloat型もdouble型も同じ%fと記述すればいいことになっている
と言う理解で合ってますか?
2021/08/16(月) 23:08:54.14ID:GAZDNQn70
相性悪いって何かあったっけ?
2021/08/17(火) 03:49:27.19ID:yPn/BtRt0
>>390
あってる。
printf ではというか可変長引数では既定の実引数拡張のルールで float は double に拡張されるから区別しようがない。
よくわかってないやつが %lf って書いちゃうから C99 から仕様に入れることになったみたいな話だったはず。
(逆に言えばそれまでは無かった。)

でも引数に double を与えるつもりなら意味的にそれがわかるにこしたことはないので、
人間が読み書きする都合を考えるなら積極的に区別したほうがいいと思う。
2021/08/17(火) 05:49:50.95ID:bbuY4XG00
>>387
64で16bitモード使えないのは単なる嫌がらせ
技術的に本当はできるのに拒否してる

必要ならVM使うといい
過去バージョンは↓で入手できる
https://winworldpc.com/library/operating-systems
2021/08/17(火) 10:00:30.15
>>393
私は長年武田さんの MS-DOS Player
http://takeda-toshiya.my.coocan.jp
を使っています‥‥
2021/08/17(火) 10:22:58.26ID:bbuY4XG00
>>394
なかなかオモロイサイトだね
спасибо!
2021/08/17(火) 11:04:10.80ID:1ngtDSTVK
>>390
>>392
整数の基本型がintであるように、小数の基本型がdoubleだから。
そもそもdoubleっつー名前が良くないと思う。いまのdoubleをfloatにして、いまのfloatをsingle floatとかshort floatにすれば良かったのに…
2021/08/17(火) 11:14:12.12ID:bbuY4XG00
年代的に元々floatが標準のつもりだったんだろうな
2021/08/17(火) 11:56:57.33ID:4Ah+oX6mM
当たり前は時代と共に変わる
399デフォルトの名無しさん (ワッチョイ 42ad-Iu++)
垢版 |
2021/08/17(火) 16:52:28.09ID:5M+zf85m0
>>396
倍精度ってのを表したかったんだろうな。
2021/08/17(火) 21:48:20.20ID:G/OIjFk20
>>396
>小数の基本型がdoubleだから。

その理由は%fがdoubleだからというトートロジーでない?
2021/08/17(火) 22:05:20.16ID:SEkFORwja
計算自体は倍精度でやっていて、floatの場合結果を丸めてるの?
2021/08/17(火) 22:24:11.58ID:oC68rP2o0
そもそも
> 可変長引数では既定の実引数拡張のルールで float は double に拡張される
って言うのがよくわからん
普通にfloatはfloatのまま渡しゃいいじゃんと思うんだけどなんか理由あったのかな?
2021/08/17(火) 22:44:19.25ID:yPn/BtRt0
引数の受け渡しにスタックを使う場合でもレジスタを使う場合でも
ワードサイズより小さい型はどうせそのワードサイズに調整して積むことになるので切り詰める意味がない。
(ワードにたくさん情報を詰め込むことも出来るといえば出来るけどかえって非効率になる。)
だから int より小さい型を int に調整するというのはハードウェア的
な都合が反映されていると思う。

昔は浮動書数点演算ユニット (FPU) は CPU の外に持っているのが普通だったんだが
その時代でも FPU のレジスタは大きめなサイズを持っていた。
double が収まるレジスタがあるなら double で受け渡すほうが都合が良かったんだろう。

※ この場合の「ワード」は2バイトという意味ではなく各アーキテクチャにおける基本サイズという意味なので注意
2021/08/18(水) 09:07:55.01ID:a3KKdrJy0
ん、8087由来のサイズになってるのはlong doubleだろ
2021/08/18(水) 09:53:36.78ID:AHN/ch/v0
long double って表現がもう頭悪いよね・・・
2021/08/18(水) 14:10:11.42ID:a3KKdrJy0
%lfはどう見てもlong floatだね
%dはint用にしちゃってるから仕方なかったのかな
2021/08/18(水) 19:02:54.03ID:9oCYCOnk0
>>405
ダブロン って表現だとゲンが悪すぎるだろ・・
2021/08/18(水) 19:55:50.38
>>403
>その時代でも FPU のレジスタは大きめなサイズを持っていた。
80bit でしたっけ、そのうち仮数部が何ビットだったかは思い出せません
2021/08/18(水) 20:09:35.86ID:Wv6HiLZZ0
符号部1ビット+指数部15ビット+仮数部64ビット
410デフォルトの名無しさん (ワッチョイ ff02-VfHF)
垢版 |
2021/08/22(日) 01:54:25.30ID:0Cz6ueFz0
Rustのメモリ安全性はボローチェッカーによって担保されているが、
Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と
C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています

Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、
GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ
限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます

Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ

なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか?

Nimの実験的特徴
著者: アンドレアス・ルンプ
バージョン: 1.5.1
http://nim-lang.github.io/Nim/manual_experimental.html


Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し
ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク
されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる

「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
2021/08/22(日) 11:26:19.76ID:D+A51yiS0
pythonを可読性高いという時点で眉唾だな・・・
2021/08/23(月) 11:13:34.28ID:4N/X7GO90
char *b = "0123456";

printf("%x\n", 3[b]);
// 33

これって、どうしてこういう書き方 3[b] ができるんだっけか
シンタックスシュガーとかじゃなく、明確な理屈があって出来ちゃうんだよね?
413デフォルトの名無しさん (エムゾネ FF9f-tXhk)
垢版 |
2021/08/23(月) 11:39:17.23ID:JYwdk8yBF
*(3 + b)
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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