1 名前:デフォルトの名無しさん [2018/08/16(木) 23:36:02.22 ID:fOCSKLtw.net] C言語の話題のみ取り扱います C++の話題はC++スレへ 質問には最低限の情報(ソース/コンパイラ/OS)を付ける 数行で収まらないソースは以下を適当に使ってURLを晒す https://paiza.io/ https://ideone.com/ codepad.org/ 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言語なら俺に聞け 146 https://mevius.5ch.net/test/read.cgi/tech/1525031257/
33 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 01:02:08.56 ID:houfzDz0.net] そんな文法はない。 宣言としては有効かな。でも意味はないだろうね。ただのポインタ。
34 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 01:20:33.12 ID:ftO9aq8g.net] >>33 じゃあ、これをポインタ表記に置き換えて見てください、お願い
35 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 03:08:45.92 ID:k5zLgYIW.net] >>24 なるほど、じゃあ君は void swap_int(int lhs[], int rhs[]); と書いてもらえれば判断つきやすいんだな
36 名前:デフォルトの名無しさん [2018/08/20(月) 04:14:23.20 ID:GHO1XUgy.net] なんというか、Cならではの問題かな。 Javaもちょっと似てるか。
37 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 06:23:59.34 ID:W9GZumqR.net] 下のようなコードを書くとコンパイルエラーになるでしょ。 int ary[100]; int val; val = ary++; このaryは配列だから、ary自体の値を変化させる操作は出来ない。 それの類推で関数の仮引数はポインタで受けるんじゃないかな。 関数の中でポインタ風に使う変数はポインタの形で宣言。 関数内で値を変化させず [] によるインデクスだけでアクセスするなら 仮引数を配列の形で宣言するのも分かりやすい書き方かも。 後は歴史的な事情。 配列風に書くとインデクス計算に掛け算を使われて遅かった名残り。 >>30 俺はmainの引数は main(int argc, char *argv[]) だな。 保守的だけど、こんな場面で独自色出すことないしね。
38 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 07:23:53.30 ID:iMQAgpc+.net] >>24 あんたの感覚は正しいと思う 同じだと言ってる奴もいるけど foo(int a[]){ a = … /* エラー */ とか微妙に違う ただそこまで気にする人があまりいないだけ
39 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 07:29:22.22 ID:OvqDIJZn.net] 関数の引数では配列の要素数は無視されるだけ 変数としての配列とポインタは別物だけど、関数の引数では全く同じもの
40 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 08:10:21.73 ID:iwav6OWh.net] 理由は既出だけど、C言語では配列とポインタは明確に違うよ。 相互変換可能なだけ。
41 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 09:01:16.78 ID:KJZ73X54.net] ぶっちゃけ、相互変換可能ならその二つは同じじゃねえか? 数学的に
42 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 09:09:43.44 ID:zNROsdOB.net] 同じ点もあるし違う点もある 同じ点を強調したいときに「同じ」 違う点を強調したいときに「違う」 と言うだけ 具体的に語らないと何の意味もない
43 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 09:30:29.85 ID:W9GZumqR.net] >>38 そのコード片、エラーになるかな? 仮引数のa(intへのポインタ)に 関数内で値を代入することは許されるはずだけど。
44 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 10:24:22.53 ID:B6E8iGMG.net] 代入ではエラーにならんと思うよ。 lvalueとして使えると思う。配列っぽく書けるがあくまでポインタ。
45 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 10:37:33.39 ID:iMQAgpc+.net] >>43-44 すまん、お前らの言う通りだ なんか勘違いしていたみたい
46 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 11:31:29.94 ID:mV0yla1z.net] >>20 パクリで儲かる成功例
47 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 11:46:22.27 ID:B6E8iGMG.net] 引数の配列がホンモノだとすると、非NULLが保証されてないとあかん。 というか構造体渡しと同様の配列渡しが必要だな。まあ使わんか。
48 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 13:08:43.61 ID:k5zLgYIW.net] >>37 その例は void func(int ary[100]) { int val; val = ary++; } との違いを示そうとしているのだとしたら int *val; じゃないとおかしいだろ >>37 []で書くべきと主張するんなら char argv[][]にしなきゃねえ もちエラーだけどw
49 名前:デフォルトの名無しさん [2018/08/20(月) 13:28:58.98 ID:HLNtX2wQ.net] >>47 ま、必要なら構造体の中に入れて渡すと。
50 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 16:12:09.36 ID:K5YeoIjy.net] 配列をパラメータにするのは サイズが決まってる時にそれを明示したい場合くらいだな ポインタの方が汎用性が高いから
51 名前:デフォルトの名無しさん mailto:sage [2018/08/20(月) 16:14:24.46 ID:K5YeoIjy.net] 構造体みたいに 値渡しやコピーもあると(たまには)便利
52 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 07:18:10.26 ID:gERn4ySS.net] >>50 void func(int ary[100]); これと void func(int *ary); これが 意味が違うと思っているのか?
53 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 07:20:36.44 ID:hlK4Wy69.net] 設計意図を示すコメント的な意味ならあると思う 中身は同じだけど
54 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 07:38:47.67 ID:Xgm2Pp2D.net] 初心者に対して誤解を与えるだけじゃね? 必ずそのサイズで呼ばれると保証されるわけでもないし。
55 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 08:20:0
] [ここ壊れてます]
56 名前:7.94 ID:FuTngql1.net mailto: >>52 意味は違うね 要素が100個以外の時に前者を使ってるコードを見たら気持ち悪いだろ? そういうこと コンパイラによってはary[1000]にアクセスすれば警告が出る [] [ここ壊れてます]
57 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 08:40:04.69 ID:ZsMFgi2m.net] ほんとに警告出るのか? サイズ指定に意味がないというのが規格だし、コメント程度の役割しか持たせたらあかんという気が
58 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 08:48:21.68 ID:Y1HyydAv.net] gcc8でもclang6でも警告でなかったょ…
59 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 09:13:57.61 ID:GIXT+l9b.net] お高い静的解析ツールだと警告出るかもね。 やってないから知らんけど。 そういう環境で開発できるならコメント以上の意味はあるかも。 仮定で申し訳ない。
60 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 09:28:29.44 ID:gERn4ySS.net] >>55 おまえの主観は聞いてない プログラムの実行結果が違ってくる例を示せ
61 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 09:30:24.31 ID:Y6yN+LUK.net] >>59 屁理屈乙
62 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 09:31:42.61 ID:hk/Hf9fq.net] >>48 多次元配列なら void func(int ary{}[100]) { } とか void func(int (*ary){}[100]) { }
63 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 09:35:21.28 ID:hk/Hf9fq.net] >>61 間違えた void func(int ary[][100]) { } とか void func(int (*ary)[100]) { }
64 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 10:40:22.58 ID:gERn4ySS.net] >>60 もう一度言う、おまえの主観は聞いてない 正論か屁理屈かはおまえの主観だ 客観的事実を示せ、理屈はそれからだ
65 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 10:57:00.63 ID:vnB4usre.net] >>63 だれも機械の解釈の違いには言及してない定期
66 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 10:59:30.05 ID:gERn4ySS.net] >>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]; は意味が違う 結局、[]で書くべきなんて主張は 通用しないところが多すぎる戯れ言だ
67 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 11:01:09.20 ID:gERn4ySS.net] >>64 プログラム言語は機械に解釈させるためのものだ 自明なことを誰も言ってないなんてことこそ屁理屈そのものだろうが
68 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 11:01:29.60 ID:+F/9g7TB.net] >>66 糖衣構文
69 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 11:02:23.89 ID:gERn4ySS.net] >>67 全然関係ねえぜ 暑さで気が触れたか?
70 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 11:05:05.84 ID:eIEuxTun.net] >>68 機械の解釈が同じでも人間には違う意味に見えるのはあるよな?
71 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 11:55:44.43 ID:gERn4ySS.net] >>69 void func(int ary[100]); これのどこが void func(int *ary); これの構文糖衣なんだ? 書いた奴の頭を疑わせる以外にどんな意味があるんだよ
72 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 11:56:39.26 ID:gERn4ySS.net] サイズが100でなければならない関数なら void func(int (*ary)[100]); こう書いて int ary[100]; func(&ary); こう渡せよボンクラ
73 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 12:10:27.14 ID:QteKsmYB.net] まあ多次元配列を引数にするのは良くないと思うわ
74 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 12:28:57.33 ID:GIXT+l9b.net] >>71 どうした? コードレビューで上司にボコボコにされた腹いせか? こんなとこでイキっても虚しいだけやで。
75 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 12:29:15.96 ID:GIXT+l9b.net] >>71 どうした? コードレビューで上司にボコボコにされた腹いせか? こんなとこでイキっても虚しいだけやで。
76 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 12:47:09.71 ID:EQ4qcC3V.net] >>72 なぜ?
77 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 12:53:55.98 ID:gERn4ySS.net] >>73 ここがム板ってことを忘れたか? 技術的な話で来い
78 名前:デフォルトの名無しさん [2018/08/21(火) 12:54:14.69 ID:m1oFA/yA.net] 多次元配列の型は typedef で型名作っておけば楽なのでは?
79 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 12:56:41.15 ID:Fhw28p93.net] >>68 >>76 この書き込みのどこが技術的な話なんだw 単にイキってるだけじゃん。
80 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 13:04:39.72 ID:gERn4ySS.net] >>78 構文糖衣の話をしたんだが 構文糖衣と書いてないと読めないオツムなのか? アホw バカwww
81 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 13:05:57.10 ID:gERn4ySS.net] さて、買い物に行くぜ 妻子の夕飯を作らにゃならん
82 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 13:09:48.25 ID:O6Fgkzwj.net] >>75 そりゃわかりにくいからだよ。 引数にするとCの多次元配列の嘘くささがよく表れるわ。 せめて構造体で包むとかして名前を付けた方がいいね。
83 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 13:09:58.77 ID:EQ4qcC3V.net] >>71 無駄なコスト
84 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 13:10:23.54 ID:RiLuNws8.net] >>70 それを糖衣構文というかどうかどうでもいいけど だれも機械の解釈の違いには言及してない定期 >>50 ➡>>52 明示とは機械に対してではなく人間に対してのことを言ってるからこの返信は意味がずれてる
85 名前:デフォルトの名無しさん [2018/08/21(火) 14:09:26.92 ID:Xve8S0h8.net] 超初心者です。 シミュレーターで動かしながら独学で学んでいるのですが、 scanfが動かない(スルーされる)ので困っています。scanfが動くシミュレーターってあります?
86 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 14:13:40.03 ID:Xve8S0h8.net] 今はpaiza.ioを使っています
87 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 14:16:15.27 ID:Hz7fBosn.net] 下の入力欄が空白じゃないの?
88 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 14:27:50.04 ID:Xve8S0h8.net] 解決しました。ありがとうございました。
89 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:15:22.43 ID:FwleoeVd.net] for文でこんなのを発見したのです。 for(;;) ご覧のとおりセミコロンがカッコ内に2つあるだけ。 これはどういうfor文でしょうか。 ググり方も分からないです。
90 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:17:35.28 ID:bAEvazF4.net] 無限ループ
91 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:22:25.64 ID:i/CPlprw.net] 昔からその書き方の無限ループを好む人は多い 俺が知ってる範囲だとカーニハンもその書き方を好んでいた
92 名前:88 mailto:sage [2018/08/21(火) 20:22:27.49 ID:FwleoeVd.net] >>89 (*´Д`)ありがとうございました。
93 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:27:12.52 ID:mIqstMqN.net] 無限ループって言っても 大概は何かの条件で脱出するわけだから while (条件) が一番わかりやすいと思う あ、好みだろうから、反論は不要です
94 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:34:59.42 ID:8p839GFL.net] >>92 俺も無限ループはwhile(TRUE)派だな。 静的解析で怒られるから使うなって人もいるけど。 これも個人の好みなので反論不要です。
95 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:45:15.49 ID:FwleoeVd.net] 無限ループには for(;;) while(1) while(true) などがあるようですが、驚いたことにfor(;;)がC言語の伝統的スタイルなんだそうで。
96 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 20:50:55.87 ID:mIqstMqN.net] goto 笑
97 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 21:07:06.74 ID:FuTngql1.net] do { } while (true); だな
98 名前:デフォルトの名無しさん [2018/08/21(火) 21:12:46.13 ID:xHZnBR+z.net] true って新しいCだと使えるの?
99 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 21:15:49.80 ID:Bspmt0aQ.net] _Bool
100 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 21:18:05.52 ID:mIqstMqN.net] while (1==1) なんて
101 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 21:21:39.51 ID:WLqP+HZB.net] for(;;)は無条件であることを的確に表現してる 条件が書いてないのはこれだけ
102 名前:デフォルトの名無しさん [2018/08/21(火) 21:30:40.05 ID:xHZnBR+z.net] そういややったことないけど while () はできないのかな? できたらできたでなんか怖いがw
103 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 21:35:16.36 ID:8p839GFL.net] >>100 冷静に考えると、何でfor(;;)の真ん中の条件式のとこ空欄でも正しい構文になるんだろうね。 for以外に条件式省略できる構文ってないよね?
104 名前:デフォルトの名無しさん [2018/08/21(火) 21:39:06.78 ID:xHZnBR+z.net] if () ができたらなんか嫌だな
105 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 22:56:19.30 ID:7hn0MDmO.net] >>102 確かに…
106 名前:さまよえる蟻人間 mailto:sage [2018/08/21(火) 23:14:00.83 ID:H0lJZ+G5.net] 左右の式が省略できるから、ついでに真ん中の式も省略可能にしたんだろう。
107 名前:デフォルトの名無しさん mailto:sage [2018/08/21(火) 23:18:17.02 ID:mIqstMqN.net] 二つのセミコロンも省略して良いことにしようw
108 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 01:03:40.03 ID:Vm7yolE7.net] ループの話でふと思い出したんだけど、この書き方キモいと思う? LOCK(); while (条件) { UNLOCK(); LOCK(); } UNLOCK();
109 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 01:07:46.55 ID:srSdeWyK.net] きもいけどきもいだけだから必要ならそうする Cだしね
110 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 01:11:58.05 ID:+gfjb8L8.net] condwaitみたいなの、たまに書くと混乱するわ
111 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 01:18:33.81 ID:J6lVaoNe.net] LOCKして、何かして、UNLOCKして解放する わけではないんだ?
112 名前:デフォルトの名無しさん [2018/08/22(水) 02:53:55.25 ID:wb9Zg9xS.net] for (\(^o^)/)
113 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 06:53:07.59 ID:Vm7yolE7.net] >>108 while (条件) で統一したいと思いつつ、この手の場合LOCK, UNLOCKのインデントがズレててキモいなといつも気になってしまう まあどーでも良すぎていつも放置するが >>110 アトミックな条件チェックの話
114 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 07:33:35.95 ID:RPMrdt6N.net] >>112 手動でインライン展開する必要がなければ、普通は、 while (check_func()) { } bool check_func(){ LOCK(); bool retval = XXX; // check something here UNLOCK(); return retval; } とする。 C++なら inline を付ければインライン展開時(元のコード)と似たようなオブジェクトコードが出ることになっている。
115 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 09:35:21.99 ID:ULC6Ul0L.net] >>107 do { LOCK(); UNLOCK(); } while (条件);
116 名前:114 mailto:sage [2018/08/22(水) 09:36:42.99 ID:ULC6Ul0L.net] ごめん、ちがた
117 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 09:52:30.97 ID:2YTphjWh.net] >>107 条件を判断するためだけにLOCK/UNLOCKを行うコードだとしたら最悪のコードだ do { LOCK 判断 UNLOCK if (!判断結果)break; } while (1); 素直にこうしなさい
118 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 11:11:08.70 ID:yAP1ongv.net] 条件判断が目的じゃないと思うぞ
119 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 11:35:04.81 ID:yJL450CM.net] どこが素直なんだ 締め切りが迫ってバグが取れず なりふり構ってらんなくなったやつが書く イカレたコードでしかない
120 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 11:58:31.90 ID:DbwOmzYq.net] >>116 これは酷いw
121 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 12:04:07.83 ID:MGgq/0yt.net] イカれたコードを紹介するぜ
122 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 12:27:28.23 ID:2YTphjWh.net] ん? 一番素直だろうが 条件判断の為だけにLOCKしてるという前提で 判断を関数に分ける? 分けるかどうかはこんなちっぽけな理由で判断するべきじゃないよ 判断の度に関数にしてたら意味不明な関数で溢れるぞ もちろん意味が明瞭で他にも同じ判断を使う可能性があるのであれば 関数やマクロでパッキングすべきだが
123 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 12:36:44.83 ID:yJL450CM.net] LOCK 判断 UNLOCK というアトミックなシーケンスを関数にする理由はちっぽけじゃない LOCK/UNLOCKが必要な具体的な場面を想定しての発言には見えない
124 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 12:50:05.96 ID:2YTphjWh.net] どういう場面かなんて>>107 では判断不能だし 分けるべきか分けないべきかも>>107 では判断不能 判断出来ないのに 「わざわざ関数構成を変えるべき」 なんて主張をすべきじゃない
125 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 13:02:48.20 ID:Xk7aTjF/.net] >>123 いやー、わからんのはあなたに実務もしくは勉強の経験がないからよ
126 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 13:14:18.16 ID:yJL450CM.net] 昨日のvoid func(int ary[100]);にしても ary[1000]を警告する処理系の具体的な例が挙がってないしな
127 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 13:39:37.67 ID:2YTphjWh.net] >>124 わからんねえ エスパーじゃないんだから 経験が少なくて 分けないべき場面が思い浮かばないんだろうねえ
128 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 14:01:43.77 ID:yJL450CM.net] 間違いない、昨日のバカだ NGIDっと
129 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 14:12:07.92 ID:JOaq3c53.net] >>127 そういうあなたは昨日のイキってた方の人?
130 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 14:15:28.00 ID:J6lVaoNe.net] パッと見て何をしているか分からないソースって 後の人が取っても苦労するし、気の毒
131 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 14:19:13.21 ID:J6lVaoNe.net] 多分書いた人の意図は while文内の判定時に LOCKしたいのかとは思うが
132 名前:デフォルトの名無しさん [2018/08/22(水) 14:26:31.81 ID:TfhbroeT.net] while ( ^∀^)
133 名前:デフォルトの名無しさん mailto:sage [2018/08/22(水) 15:10:17.96 ID:44OVOulF.net] check_func()というアドホックっぽい関数名が誤解のもとかな get条件atomically()にすれば意図が明白