C言語なら俺に聞け 155

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 76ba-P5bm)
垢版 |
2020/05/10(日) 23:20:27.99ID:Z3WQBr9X0
!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言語なら俺に聞け 154
https://mevius.5ch.net/test/read.cgi/tech/1578997950/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2020/06/27(土) 10:23:22.01ID:qKnmoagb0
>>328
お前が揶揄してる人(おれ)が言ってることがようするに
> 使う範囲、使う環境、移植性、...
を考慮して選択しろと言ってるんだが。
2020/06/27(土) 10:23:42.01ID:TsX0h7IG0
C言語スレだから

チープな8bit環境から
スーパーコンピューターまで
様々な所で使われる

重視すべき項目は時と場合で大きく違う
2020/06/27(土) 10:25:33.79ID:TsX0h7IG0
>>327を見ると
常に後者を選ぶべき
だと思ってるように見えるけど
2020/06/27(土) 10:29:38.97ID:qKnmoagb0
>>268 の次の >>271 なんかを含め流れを見て言ってくれてるのかしら
2020/06/27(土) 10:49:08.20ID:TsX0h7IG0
>>265
オーバーフローやアンダーフローを意識してコーティングすべきと

それは良い心がけで
2020/06/27(土) 11:08:27.27ID:qKnmoagb0
>>333
たぶん論旨は伝わったと思うので追い打ちかけるつもりではないが、レス付けるに当たっては「オーバーフローを回避するなら」と必ず付けてるし、扱う値の範囲を鑑みて型が充分か考慮しろと言ってるだけのことな。
扱うのが宇宙の座標をメートル単位で、くらいの話なら double でもオーバーフロー的な問題は無いなとか、
でももしシミュレーションで宇宙を100次元空間として体積を求める話だったら double でも大丈夫かな?とか考慮するでしょ。
まあそんなケースだと値の大きさより有効桁の方が心配だけど、なんにしてもとりあえずデカい型だから大丈夫wなんて漫然と思ってるならただのアホという至極当然の話。
2020/06/27(土) 12:40:30.36ID:Fil4ka9J0
>>323
> 乗算と除算の演算順がコンパイラによって変わる
> というのはQZの勘違いな主張で
> 明確に順番は決まってる
エビデンス持って来てからほざけ
2020/06/27(土) 12:53:15.33ID:F1FZoULud
>>334
状況によって適切なコードを選ぶべきと思ってるなら別にいい
そうじゃなさそうだったので

「間違ってる」「バグ」「正しくない」という主張じゃなかった?

2分検索が10%しか正しく書けないなんてことはないと思うんだがね
2020/06/27(土) 13:02:32.88ID:qKnmoagb0
>>336
>2分検索が10%しか正しく書けないなんてことはないと思うんだがね
そう、ここが気になったんだけど、でももし二分検索を書いたこと無い人がアルゴリズムを見て一発で動作するコードが書けるか?という話なら、案外その程度かもと思ったり。
分割時の端数処理の考慮が不適切でインデックスが変化せず無限ループに陥ったり、検索から抜け落ちる要素が出たり、要素数が0〜2ないし3くらいの範囲でうまく動かなかったり。
ちょっと動かせばすぐ修正点に気付いて動くコードに仕立てられるだろうけど、ぶっつけで動かせるかと言ったら案外難しいんじゃね。
2020/06/27(土) 14:22:51.51ID:BPJhbq4z0
クイックソートを一発で書けと言われるとちょっとつらい。
あまりにうろ覚えすぎる。

30分待ってやる
と言われれば思い出しながら余裕を持って書ける。かな?

いやどうだろう?
ソートは完璧だろうけど、アルゴリズムはあやしいな
「クイックに似た何かソート」になりそうかも
2020/06/27(土) 15:37:58.80ID:vUQmFWhd0
>>296,298-301
些細なことですが、>>296,298,299 の結果は納得いかないです

>int y = (x = 1) + (x = 2);

たしかに gcc/clang とも警告は出ますが、しかしそれはシーケンスポイント間で i を複数回書き込んでいる、という警告で、それは i の値が 2, 5 のいずれかになるか不確定という意味ですね

しかし演算子 + のオペランドの値は確定していて、すなわち 2 と 5
だから y の値は、この場合は確定的に 7 になるはずです

実際、手元の clang(8,0,1) でコンパイルした場合、結果は y = 7 で上の解釈と合致します。
私は gcc がバグっていると思いました。
2020/06/27(土) 15:40:36.38ID:vUQmFWhd0
>>339
×シーケンスポイント間で i を複数回書き込んでいる、という警告で、それは i の値が 2, 5 のいずれかになるか不確定
○シーケンスポイント間で x を複数回書き込んでいる、という警告で、それは x の値が 2, 5 のいずれかになるか不確定
2020/06/27(土) 16:04:40.17ID:WNNU6Y/YK
既出かもしれんが
>int y = (x = 1) + (x = 2);
演算順は
(x = 1)
(x = 2)
左辺値 x + 左辺値 x
y = その結果
なんじゃないの?
2020/06/27(土) 16:14:25.88ID:vUQmFWhd0
>>339
なんだか >>340 だけではなくて、いろいろ間違えまくってますね…ごめんなさい、今日は寝ます
2020/06/27(土) 16:26:01.60ID:vUQmFWhd0
>>341 ありがとうございます
JISX0301 の代入演算子をみると
>「6.5.16 セマンティクス「代入式は、代入後の左オペランドの値を持つが、左辺値でない」
つまり
式 x = 2
の値は 2 ではなく x というわけですか…なるほど
2020/06/27(土) 18:53:06.85ID:fF6t87uZa
式の値は x = 1 なら 1 だけど、その式の値が x と同一といわれると微妙な気が
コンパイラによって結果が変わってきそうな気も
2020/06/27(土) 19:00:52.23ID:zYxBmbbI0
数学の変数とプログラムの変数は別物。
2020/06/27(土) 20:34:42.19ID:5xR8poHP0
そもそもイコールではなくて代入だもんね
2020/06/27(土) 20:36:44.26ID:TsX0h7IG0
比較が =
代入が :=
の方が良かったと思う
2020/06/27(土) 20:37:36.35ID:5xR8poHP0
:3
2020/06/27(土) 20:39:21.93ID:ItnTp6fM0
>>342
寝るの早いよ!
2020/06/27(土) 20:42:32.55ID:zYxBmbbI0
つ ぴゅう太BASIC
2020/06/27(土) 20:44:48.50ID:aqzZKmXR0
>>347
PASCALが嫌いな人が作った言語でか?
352デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 20:56:58.25ID:YxSvZ5UV0
代入も比較も同じ = 記号なんだけど代入した結果を利用できない言語はあるね。
353デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 20:57:46.41ID:YxSvZ5UV0
あ、ごめん。ないかな?でも作れなくはないか。
2020/06/27(土) 21:01:20.32ID:fF6t87uZa
>>353
代入文の言語とか
2020/06/27(土) 21:01:54.32ID:fF6t87uZa
文は値を持たないから
2020/06/27(土) 21:16:43.71ID:fF6t87uZa
代入式なら
a = b = 0:
は大丈夫だけど、
代入文の言語ではダメ(文法エラー)
卑近な例だと excelVBAとか
2020/06/27(土) 21:48:32.85ID:TsX0h7IG0
>>352
BASIC
358デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 21:54:01.50ID:YxSvZ5UV0
あ、そうだ。昔の BASIC がそれだったな。今もそうか。
2020/06/27(土) 22:14:52.03ID:8IoNpLP20
Fortranも駄目だった気がする
360デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/27(土) 22:45:34.92ID:3uU6UKGu0
iZ-Cで頑張っている方々もいる。
2020/06/27(土) 22:52:26.39ID:Fil4ka9J0
>>359
C言語以前の言語はたいてい駄目だな
例外はLispぐらいかな
362デフォルトの名無しさん (ワッチョイ 3fad-p8b5)
垢版 |
2020/06/27(土) 23:11:39.40ID:YxSvZ5UV0
ま、しかし、本当なら代入は全く違う記号(あるいはワード)使って欲しいところではある。
昔々中学生の頃に初めてBASICのリストを見て A = A + 1 ってなんじゃこりゃと思った事あるし。
普通の数学や算数とルールが違っているのに同じであるかのような記号の使い回しで混乱w
2020/06/27(土) 23:17:49.21ID:WNNU6Y/YK
それ小学生のとき見たからすんなり入ってきた
方程式とは違うよってご丁寧に書いてあったし混乱はなかった
2020/06/27(土) 23:24:19.62ID:zYxBmbbI0
>a = b = 0:
BASICじゃ
bが0なら a=-1
bが0でないなら a=0
だっけ。
2020/06/27(土) 23:37:39.31ID:fF6t87uZa
そっか、そのとき b = 0 は代入文じゃなくて、値を持つ比較式ですね
文法は間違いでした
2020/06/27(土) 23:38:09.75ID:fF6t87uZa
文法エラーは間違いでした
でした
2020/06/28(日) 00:32:47.05ID:akwdxVh60
=は代入が比較より使用頻度が高いので、2文字(=:)が代入だと地味に面倒そう。
2020/06/28(日) 07:11:45.70ID:4OGtUBl/0
>>362
APLお勧め
369デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/28(日) 11:47:20.61ID:vGhSDCc20
iZ-Cに反応しないのは素人か。
2020/06/28(日) 17:12:13.76ID:8Xgo7zrJ0
>>368
今のAPLはつまんなくなったね
2020/06/28(日) 21:51:57.49ID:kMbOl++G0
変数名を文字列で取得したいんだけど どうしたらいいかな

printfデバッグとかで、 printf("hogehoge=%d\n",hogehoge); ってやるじゃん?
これをちょっとだけ効率よくしたいけど、マクロでどうにかならん?
2020/06/28(日) 21:54:48.80ID:Iks3cRKy0
>>371
マクロ定義のときは識別子に # を付けると識別子を文字列扱いできる。
2020/06/28(日) 22:04:34.55ID:2DMHRA/z0
#define POUT(x) printf("%s = %d\n", #x, (x))
こんな感じ?
2020/06/28(日) 22:18:47.05ID:dcZQFZ1fd
#define POUT(x) printf(#x " = %d\n", (x))
こっちの方がいいか?
2020/06/28(日) 22:53:44.96ID:HzcxpANJ0
文字列リテラルの連結は滅多に使わないけど盲点というか
わかってて使うには良いものだね
"aaaa" "bbbb" → "aaaabbbb" として解釈される
2020/06/28(日) 22:57:59.33ID:qWBhd30v0
>>375
よく使ってました
長い文字列を記述する際に
空白文字ではなく改行文字を入れてたな
2020/06/28(日) 23:05:22.34ID:sygO1Ih/0
usage表示したいときとか普通に使うわ
2020/06/29(月) 00:09:50.35ID:eubxXrdwd
私も普通に使う
379デフォルトの名無しさん (ワッチョイ 8f01-/Fs/)
垢版 |
2020/06/29(月) 01:27:56.70ID:C/fQS0GP0
viがバグるのでやめてください。
2020/06/29(月) 08:55:46.03ID:UQIGysI+0
vimはバグらないぞ
2020/06/29(月) 08:57:31.19ID:y9Ww1t9/H
もしかして: vim
2020/06/29(月) 08:58:42.61ID:nBP9TntY0
vimじゃないviには長年世話になったもんだ
2020/06/29(月) 13:35:04.89ID:rjGVLU620
>>374
書式文字列が常に同じになるケース(>>373)だとコンパイラの最適化で使い回されるようになるけど、
変数名を連結して書式文字列が場所ごとに変わっちゃうと使い回しが効かなくなるから、メモリ使用量とかファイルサイズで不利になるかもね。
前者にしても変数名そのものの文字列は別途定義されるのもあってほんの些細な違いだから、しいて言えばって程度の話だけど。
384デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:01:50.53ID:fw2IFdDxF
and が & と &&
or が | と ||
という具合に bit 演算用と論理演算用で演算子が違いますが

bit 演算の xor は ^ で
int a = 123, b = 456;
のとき a^b と描けますが

論理式の xor はどう描けばいい?
bool u = true, v = true;
のとき u^v と描いても問題無いですか?
2020/06/29(月) 15:17:39.29ID:TPMqgpKl0
(u != v) で良いのでは?
386デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:25:14.45ID:fw2IFdDxF
bool に 0 と !0 以外が入ってても大丈夫ですか?
387デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:27:23.97ID:fw2IFdDxF
もし御存じの方がいらっしゃったらで良いのですが
"u ^^ v" みたいな演算子が無い理由も知りたいです
問題後出しで済みません
2020/06/29(月) 15:37:10.60ID:y9Ww1t9/H
ビットごとのxorは暗号とかで多用するけど、
論理式のxor(一方のみ真)はめったに使わないからかと。

!u != !v が最小かな。
389デフォルトの名無しさん (エムゾネ FF5f-qwRG)
垢版 |
2020/06/29(月) 15:41:17.96ID:fw2IFdDxF
ありがとうございました
2020/06/29(月) 16:32:31.26ID:nBP9TntY0
関係演算子の結果はint型の1か0なんだから
a < 124 ^ b < 456 でもいいはず
2020/06/29(月) 17:07:26.21ID:TPMqgpKl0
C99以降のbool型(_Bool型)の値はfalse(0)とtrue(1)のどちらかしか取り得ない
変数や式の評価が0以外の場合はすべて1に変換される
評価結果の値が不明の場合はbool型にキャストすると良い
(bool)u != (bool)v
2020/06/29(月) 17:12:09.58ID:vApDDB4S0
イディオムとしては !! を付ける (否定を二回やる) というのもよく知られている。
(見づらいので良くないという意見もある。)
2020/06/29(月) 17:19:40.81ID:nBP9TntY0
!!は厨二病臭くて俺はあんまりやらないが
この程度で読みづらいとか言い出すスキル不足なやつに迎合する意図は毛頭ない
2020/06/29(月) 17:24:25.71ID:TPMqgpKl0
適当サンプルプログラム
https://i.imgur.com/OgY6Qcz.png
2020/06/29(月) 17:44:20.33ID:1Lbf5C9Kd
0, !0 意外の値が入ってた場合にどんな結果を期待するかによる
2020/06/29(月) 17:55:06.30ID:I0J8qHbO0
禅問答かよ。
2020/06/29(月) 19:26:41.50ID:xaDJZCCE0
>>395
話の流れぐらい読めよ…
>>385が成立するかどうかだろ
398デフォルトの名無しさん (JP 0Hbf-EqIm)
垢版 |
2020/06/29(月) 19:30:21.97ID:rBtTXcyIH
C言語に使ってるエディタとかIDEとか教えてください
OSとかの環境もあるとありがたい
2020/06/29(月) 19:31:22.68ID:JUEjBXx8d
EDLIN
400デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/29(月) 19:59:21.99ID:x9/2kcfz0
>>398
C言語を何に使うかによって全然違うと思うけど
2020/06/29(月) 20:00:40.16ID:JUEjBXx8d
何に使うかでそんなに変わるか?
2020/06/29(月) 20:03:09.44ID:6d9dL1u1a
C言語でエンドルフィンの造出をアヘアヘ
2020/06/29(月) 20:05:23.72ID:w+wTil7e0
>>398
コンパイラ:cygwin の中の mingw32
エディタ:xyzzy
あと cygwin の make
2020/06/29(月) 20:13:09.53ID:o6pktO+O0
学習用途で ideone や codepad 規模で済むなら Webブラウザ
2020/06/29(月) 20:21:56.62ID:TPMqgpKl0
>>398
VisualStudioCodeの統合ターミナルでWindows10のWSL2利用
参考として>>394の環境は以下の通り
https://i.imgur.com/uDwONkZ.png
2020/06/29(月) 20:23:46.01ID:vApDDB4S0
>>398
OS: Windows10
コンパイラ: gcc と clang (msys2 の pacman で入るやつ)
       その他に Open Watcom C とか LCC (LSI-C じゃなくて Little C Compiler ね) とか
エディタ: Emacs
407デフォルトの名無しさん (ワッチョイ 8fe6-vKxb)
垢版 |
2020/06/29(月) 20:24:01.34ID:x9/2kcfz0
初学の時、H8に書くとき、arduinoに書くとき、それぞれ全部違ったわ。
2020/06/29(月) 21:14:11.50ID:Gzb8Tiox0
>>398
OS:Linux(Fedora32)
コンパイラ:gcc
エディタ:vim
409デフォルトの名無しさん (ワッチョイ ff8c-ZANo)
垢版 |
2020/06/29(月) 21:49:44.45ID:uavgiC7w0
適切な問題とヒントが一番大事。
2020/06/30(火) 06:48:50.33ID:W+MWiusu0
>>398
秀丸
2020/06/30(火) 07:20:47.85ID:ojYrCHBE0
漏れは、Windows 10, WSL, Ubuntu 18.04 で、
VSCode の拡張機能、Remote WSL も使う

Linux側には、日本人が作った、バージョンマネージャーのanyenv で、rbenv, nodenv を使って、
ruby 2.6.6, node 12.16.2 を、build-essential で、コンパイルして入れた

yarn は、Windows側に入れて、WSL から、拡張子なしのyarn コマンドを呼べる。
これは、#!/bin/sh で始まるシェルスクリプト

anyenv は多言語向きで、rbenv, nodenv, pyenv, phpenv などを同じ使い方で、統一的に扱える

build-essential には、
gcc(GNU C compiler), g++(GNU C++ compiler), libc6-dev(GNU C Library), make などが入っています

パッケージ: build-essential
https://packages.ubuntu.com/ja/bionic/build-essential
2020/06/30(火) 11:26:03.93ID:Xg3HKp34M
build-essential以外はC言語には関係ないな
2020/07/02(木) 09:18:11.06ID:1XrTO7+60
Cに限らず汎用で使える開発環境で色々やってるってことかと。

俺も基本的にはvimとmakeで何でもやる。
vimの中でとりあえず :make と打ってQuickFix機能でエラー修正。
上手く拾ってくれない時は ~/.vimrc で errorformat 変数に追加。

>>398 の人はOSも知りたいってことなので追加。
Linuxのウィンドウ環境使わないコンソールでfbterm(日本語表示用)。
ツール類はディストリビューションに入ってた奴。
2020/07/06(月) 17:38:55.00ID:6O25/+p5H
int main (void)
{ char a[256];
printf("Enter a string:");
scanf("%s", a);

(以下略)
勉強中に上のような「キーボード入力からchar型配列に文字列を格納する」という処理を見かけました
この例だと(ヌル文字含め)256文字以上の文字が入力されたときはその後の処理が正常にできなくなりますよね
現実的には値を充分大きく指定しておけば問題はないのでしょうが、入力された文字数に応じて要素数を適切に設定したりはできないのでしょうか?
2020/07/06(月) 17:43:57.76ID:Js6m+wFY0
>>414
出来るけど、そのレベルの初心者にきちんとしたやり方を説明するのは難しいので
とりあえず入門書を最後まで読んでからにして。
2020/07/06(月) 19:26:19.29ID:y838Udr90
>>414
scanf("%255s", a);
とか書いとけばいーんだよ こんなもん
scanf使うなとか言うアマチュアは脳死
2020/07/06(月) 19:39:29.44ID:A/JwDwXO0
後続処理で問題が起きる
2020/07/06(月) 19:40:44.58ID:X9mxW4kC0
a[255]=0;
2020/07/06(月) 20:42:40.45ID:sDUgop1M0
scanfは入力ミスでへんな無限ループに陥ったことがあるからなぁ。
2020/07/06(月) 20:45:13.65ID:X9mxW4kC0
それはscanfの問題?
2020/07/06(月) 20:50:02.85ID:sDUgop1M0
入力バッファに改行が残って云々ってことらしい。
2020/07/07(火) 06:45:34.69ID:hl3O6vw80
scanfの問題ではないね
!=EOFなんて書くバカが100%悪い
2020/07/07(火) 07:24:10.77ID:stuZ2AfxM
入力バッファに残った改行コードが問題の場合は fflush(stdin) で吐き出さないとどうにもならない
2020/07/07(火) 07:43:16.74ID:bJbvn87/0
fflush() が確実に効くのは出力ストリームだけでしょ。
stdin でも使える独自拡張された環境もあるか知れんけど。
2020/07/07(火) 07:54:27.38ID:p6ZLMZTk0
scanf前にバッファクリアするコードあったけど、
そういうやつってパイプやリダイレクトつかっても正常作動するの?
2020/07/07(火) 11:09:20.23ID:qR67pRFEM
パイプやリダイレクトか判定する方法がOSによって提供されてる環境なら問題ない
2020/07/07(火) 12:04:22.54ID:tzlORGl20
方法が用意されててもそれをきちんと利用してるソフトが少なかったら意味ないぞ。
2020/07/07(火) 12:19:33.35ID:/8q6WRwjd
scanfをそのまま不特定多数が使うソフトに入れることなんかないんだから

正しく入力してください
で終わる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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