X



C言語なら俺に聞け 147

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
垢版 |
2018/08/16(木) 23:36:02.22ID:fOCSKLtw
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言語なら俺に聞け 146
https://mevius.5ch.net/test/read.cgi/tech/1525031257/
0054デフォルトの名無しさん
垢版 |
2018/08/21(火) 07:38:47.67ID:Xgm2Pp2D
初心者に対して誤解を与えるだけじゃね?
必ずそのサイズで呼ばれると保証されるわけでもないし。
0055デフォルトの名無しさん
垢版 |
2018/08/21(火) 08:20:07.94ID:FuTngql1
>>52
意味は違うね

要素が100個以外の時に前者を使ってるコードを見たら気持ち悪いだろ?
そういうこと

コンパイラによってはary[1000]にアクセスすれば警告が出る
0056デフォルトの名無しさん
垢版 |
2018/08/21(火) 08:40:04.69ID:ZsMFgi2m
ほんとに警告出るのか?
サイズ指定に意味がないというのが規格だし、コメント程度の役割しか持たせたらあかんという気が
0058デフォルトの名無しさん
垢版 |
2018/08/21(火) 09:13:57.61ID:GIXT+l9b
お高い静的解析ツールだと警告出るかもね。
やってないから知らんけど。

そういう環境で開発できるならコメント以上の意味はあるかも。
仮定で申し訳ない。
0063デフォルトの名無しさん
垢版 |
2018/08/21(火) 10:40:22.58ID:gERn4ySS
>>60
もう一度言う、おまえの主観は聞いてない
正論か屁理屈かはおまえの主観だ
客観的事実を示せ、理屈はそれからだ
0065デフォルトの名無しさん
垢版 |
2018/08/21(火) 10:59:30.05ID:gERn4ySS
>>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]; は意味が違う
結局、[]で書くべきなんて主張は
通用しないところが多すぎる戯れ言だ
0066デフォルトの名無しさん
垢版 |
2018/08/21(火) 11:01:09.20ID:gERn4ySS
>>64
プログラム言語は機械に解釈させるためのものだ
自明なことを誰も言ってないなんてことこそ屁理屈そのものだろうが
0070デフォルトの名無しさん
垢版 |
2018/08/21(火) 11:55:44.43ID:gERn4ySS
>>69
void func(int ary[100]); これのどこが
void func(int *ary); これの構文糖衣なんだ?
書いた奴の頭を疑わせる以外にどんな意味があるんだよ
0071デフォルトの名無しさん
垢版 |
2018/08/21(火) 11:56:39.26ID:gERn4ySS
サイズが100でなければならない関数なら
void func(int (*ary)[100]); こう書いて
int ary[100];
func(&ary); こう渡せよボンクラ
0073デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:28:57.33ID:GIXT+l9b
>>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。
0074デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:29:15.96ID:GIXT+l9b
>>71
どうした?
コードレビューで上司にボコボコにされた腹いせか?
こんなとこでイキっても虚しいだけやで。
0077デフォルトの名無しさん
垢版 |
2018/08/21(火) 12:54:14.69ID:m1oFA/yA
多次元配列の型は typedef で型名作っておけば楽なのでは?
0079デフォルトの名無しさん
垢版 |
2018/08/21(火) 13:04:39.72ID:gERn4ySS
>>78
構文糖衣の話をしたんだが
構文糖衣と書いてないと読めないオツムなのか?
アホw バカwww
0081デフォルトの名無しさん
垢版 |
2018/08/21(火) 13:09:48.25ID:O6Fgkzwj
>>75
そりゃわかりにくいからだよ。
引数にするとCの多次元配列の嘘くささがよく表れるわ。
せめて構造体で包むとかして名前を付けた方がいいね。
0083デフォルトの名無しさん
垢版 |
2018/08/21(火) 13:10:23.54ID:RiLuNws8
>>70
それを糖衣構文というかどうかどうでもいいけど
だれも機械の解釈の違いには言及してない定期

>>50>>52
明示とは機械に対してではなく人間に対してのことを言ってるからこの返信は意味がずれてる
0084デフォルトの名無しさん
垢版 |
2018/08/21(火) 14:09:26.92ID:Xve8S0h8
超初心者です。
シミュレーターで動かしながら独学で学んでいるのですが、
scanfが動かない(スルーされる)ので困っています。scanfが動くシミュレーターってあります?
0088デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:15:22.43ID:FwleoeVd
for文でこんなのを発見したのです。
for(;;)
ご覧のとおりセミコロンがカッコ内に2つあるだけ。
これはどういうfor文でしょうか。
ググり方も分からないです。
0090デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:22:25.64ID:i/CPlprw
昔からその書き方の無限ループを好む人は多い
俺が知ってる範囲だとカーニハンもその書き方を好んでいた
009188
垢版 |
2018/08/21(火) 20:22:27.49ID:FwleoeVd
>>89
(*´Д`)ありがとうございました。
0092デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:27:12.52ID:mIqstMqN
無限ループって言っても
大概は何かの条件で脱出するわけだから
while (条件) が一番わかりやすいと思う
あ、好みだろうから、反論は不要です
0093デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:34:59.42ID:8p839GFL
>>92
俺も無限ループはwhile(TRUE)派だな。
静的解析で怒られるから使うなって人もいるけど。
これも個人の好みなので反論不要です。
0094デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:45:15.49ID:FwleoeVd
無限ループには
for(;;)
while(1)
while(true)
などがあるようですが、驚いたことにfor(;;)がC言語の伝統的スタイルなんだそうで。
0097デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:12:46.13ID:xHZnBR+z
true って新しいCだと使えるの?
0100デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:21:39.51ID:WLqP+HZB
for(;;)は無条件であることを的確に表現してる
条件が書いてないのはこれだけ
0101デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:30:40.05ID:xHZnBR+z
そういややったことないけど while () はできないのかな?
できたらできたでなんか怖いがw
0102デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:35:16.36ID:8p839GFL
>>100
冷静に考えると、何でfor(;;)の真ん中の条件式のとこ空欄でも正しい構文になるんだろうね。
for以外に条件式省略できる構文ってないよね?
0103デフォルトの名無しさん
垢版 |
2018/08/21(火) 21:39:06.78ID:xHZnBR+z
if () ができたらなんか嫌だな
0107デフォルトの名無しさん
垢版 |
2018/08/22(水) 01:03:40.03ID:Vm7yolE7
ループの話でふと思い出したんだけど、この書き方キモいと思う?

LOCK();
while (条件) {
  UNLOCK();
  LOCK();
}
UNLOCK();
0111デフォルトの名無しさん
垢版 |
2018/08/22(水) 02:53:55.25ID:wb9Zg9xS
for (\(^o^)/)
0112デフォルトの名無しさん
垢版 |
2018/08/22(水) 06:53:07.59ID:Vm7yolE7
>>108
while (条件) で統一したいと思いつつ、この手の場合LOCK, UNLOCKのインデントがズレててキモいなといつも気になってしまう
まあどーでも良すぎていつも放置するが

>>110
アトミックな条件チェックの話
0113デフォルトの名無しさん
垢版 |
2018/08/22(水) 07:33:35.95ID:RPMrdt6N
>>112
手動でインライン展開する必要がなければ、普通は、

while (check_func()) {
}

bool check_func(){
LOCK();
bool retval = XXX; // check something here
UNLOCK();
return retval;
}

とする。
C++なら inline を付ければインライン展開時(元のコード)と似たようなオブジェクトコードが出ることになっている。
0115114
垢版 |
2018/08/22(水) 09:36:42.99ID:ULC6Ul0L
ごめん、ちがた
0116デフォルトの名無しさん
垢版 |
2018/08/22(水) 09:52:30.97ID:2YTphjWh
>>107
条件を判断するためだけにLOCK/UNLOCKを行うコードだとしたら最悪のコードだ

do {
LOCK
判断
UNLOCK
if (!判断結果)break;
} while (1);

素直にこうしなさい
0118デフォルトの名無しさん
垢版 |
2018/08/22(水) 11:35:04.81ID:yJL450CM
どこが素直なんだ
締め切りが迫ってバグが取れず
なりふり構ってらんなくなったやつが書く
イカレたコードでしかない
0121デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:27:28.23ID:2YTphjWh
ん?
一番素直だろうが
条件判断の為だけにLOCKしてるという前提で

判断を関数に分ける?
分けるかどうかはこんなちっぽけな理由で判断するべきじゃないよ
判断の度に関数にしてたら意味不明な関数で溢れるぞ

もちろん意味が明瞭で他にも同じ判断を使う可能性があるのであれば
関数やマクロでパッキングすべきだが
0122デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:36:44.83ID:yJL450CM
LOCK
判断
UNLOCK
というアトミックなシーケンスを関数にする理由はちっぽけじゃない
LOCK/UNLOCKが必要な具体的な場面を想定しての発言には見えない
0123デフォルトの名無しさん
垢版 |
2018/08/22(水) 12:50:05.96ID:2YTphjWh
どういう場面かなんて>>107では判断不能だし
分けるべきか分けないべきかも>>107では判断不能

判断出来ないのに
「わざわざ関数構成を変えるべき」
なんて主張をすべきじゃない
0125デフォルトの名無しさん
垢版 |
2018/08/22(水) 13:14:18.16ID:yJL450CM
昨日のvoid func(int ary[100]);にしても
ary[1000]を警告する処理系の具体的な例が挙がってないしな
0126デフォルトの名無しさん
垢版 |
2018/08/22(水) 13:39:37.67ID:2YTphjWh
>>124
わからんねえ
エスパーじゃないんだから

経験が少なくて
分けないべき場面が思い浮かばないんだろうねえ
0129デフォルトの名無しさん
垢版 |
2018/08/22(水) 14:15:28.00ID:J6lVaoNe
パッと見て何をしているか分からないソースって
後の人が取っても苦労するし、気の毒
0131デフォルトの名無しさん
垢版 |
2018/08/22(水) 14:26:31.81ID:TfhbroeT
while ( ^∀^)
0132デフォルトの名無しさん
垢版 |
2018/08/22(水) 15:10:17.96ID:44OVOulF
check_func()というアドホックっぽい関数名が誤解のもとかな
get条件atomically()にすれば意図が明白
0133デフォルトの名無しさん
垢版 |
2018/08/22(水) 15:19:38.80ID:yJL450CM
atomicallyって文言いるかねえ
いちいち全部につけて回るより
LOCK/UNLOCKしてることは
忘れたフリができるほうがいいと思うが
0134デフォルトの名無しさん
垢版 |
2018/08/22(水) 16:17:52.89ID:BT6ndhEb
英語圏の人には for (;;) をまとめて熟語的に "forever" と読めて
座りがいいのかも知れん。
カーニハンとパイクの『プログラミング作法』に
それに近いようなことが書いてあった。
0137デフォルトの名無しさん
垢版 |
2018/08/22(水) 16:44:34.35ID:AU3mefLA
>>134
そう言われると確かに座りが良いかもしれんが、(;;)をeverと読むのか。。。
今の時代では顔文字の失敗作にしか見えんなw
0138デフォルトの名無しさん
垢版 |
2018/08/22(水) 16:54:07.40ID:yJL450CM
>>134
#define ever (;;)
とかやんの?

だったら
#define forever for (;;)
のほうがマシだと思う

>>135
空想論なら付き合ってらんねえぜ
0139134
垢版 |
2018/08/22(水) 17:01:35.42ID:BT6ndhEb
「その部分のループ、終了条件が色々なんでとりあえず for (;;) で回して」
みたいな口答でのやりとりで for (;;) を forever と読めば手っ取り早いでしょ。
while (1) で…よりも言いやすいんじゃないかと。

これは空想論だけどね。
0140デフォルトの名無しさん
垢版 |
2018/08/22(水) 17:28:26.65ID:yJL450CM
無限ループで済むことを
forの第2式を空欄で
なんて回りくどい言い方しねえよ
0141デフォルトの名無しさん
垢版 |
2018/08/22(水) 17:52:35.43ID:l5cdWJfA
>>140
別に回りくどくないし
良く見るコードだよ

いろんな人のコードを見たりしないの?
みんないろんなポリシーでいろんなコードを書くから

いろんな書き方を知っていた方が良いよ
0142デフォルトの名無しさん
垢版 |
2018/08/22(水) 17:59:10.07ID:l5cdWJfA
while (条件)
でしかループが組めないのはちょっとさみしい

無理やりこの形にするために
>>107みたいな意味不明なコードになる
0146デフォルトの名無しさん
垢版 |
2018/08/22(水) 20:52:31.01ID:ROURn6Ut
for ( ;∀;)
0147デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:21:35.96ID:yJL450CM
> while (条件)でしかループが組めないのはちょっとさみしい

ここは同意
while(1) であろうが for(;;) であろうが同じこと
どっちかが好みで他方で書かれたからって可読性が落ちたとか騒ぐ
救いようのないドアホには付き合ってらんね
それだけだ
0149デフォルトの名無しさん
垢版 |
2018/08/22(水) 21:26:52.07ID:MwkxeX8r
whileで無限ループする場合、0じゃなければ1以外を
使ってもいいわけだがどうする?
電話番号とか使えばオシャレかもしれないよ
■ このスレッドは過去ログ倉庫に格納されています

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