質問するログイン新規登録

回答編集履歴

4

修正

2018/02/07 06:07

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -19,6 +19,8 @@
19
19
  辞書順の場合、`???_in_lexical_order` (これはただのstrcmpと同じ)
20
20
  数値順の場合、`???_in_numerical_order`などが考えられるでしょう。
21
21
 
22
+ **訂正:strcmp = 辞書順 は誤り。詳しくはa_saitohさんの回答をご覧ください。**
23
+
22
24
  ---
23
25
  すごく頭でっかちですけど、ここまで書けばかなり誤解は減るでしょう。
24
26
  ```C

3

コメントを受けて

2018/02/07 06:07

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -44,4 +44,70 @@
44
44
  ---
45
45
  > cのif文の条件分岐では ... 真偽を明示すべきか
46
46
 
47
- C99以降では、stdbool.hに定義されているtrue/falseを使えば良いかと思います。
47
+ C99以降では、stdbool.hに定義されているtrue/falseを使えば良いかと思います。
48
+
49
+ コメントを受けて
50
+ ---
51
+ > おそらく関数の定義を自分が誤解していたので関数は辞書順に見て前か後ろ(または同じ)かという実装の問題ではないかと思います
52
+
53
+ 私もそんな気がします。
54
+
55
+ ---
56
+ > ```C
57
+ bool strBefore(char *s, char *t) {
58
+ if (strcmp(s, t) <0)
59
+ return true;
60
+ else
61
+ return false;
62
+ }
63
+ bool strBefore2(char *s, char *t) {
64
+ return strcmp("1", "2")<0?true:false;
65
+ }
66
+ > ```
67
+
68
+ 次のように書いた方が簡潔かと思います。
69
+ ```C
70
+ bool strBefore3(char *s, char *t) {
71
+ return strcmp(s, t) < 0;
72
+ }
73
+ ```
74
+
75
+ > 変数名には 「より前」の翻訳で出てきたbeforeを使い
76
+
77
+ cmpよりは彩りがある言葉ですね。
78
+ しかし`s.before(t)`という形式で記述出来ないので、コメントは添えた方が丁寧に思います。
79
+
80
+ > bool型に変えられる部分は変えてみました。
81
+
82
+ falseが0、trueが非0というのは信頼してコードを書いていいかと。
83
+ 厳密には規格書に当たらないといけないですし、それに反する実装も存在し得ますが、
84
+ 私にはそれを判断するだけの知見が現状無いです。すみません。
85
+
86
+ > マジックナンバーはあまりよくないらしいですが、この関数では、多くの場合実装を変更する人は、strcmp()の仕様を既に理解しているか、知らなくても理解してから変更すると思われるので、「if (strcmp(s, t) <= 0)」の0をローカルだからと言って短い名前の変数にしても、strcmp()の返り値がわかっている人が見た場合、逆にコードの理解の妨げになるかと思ってつけませんでした。
87
+
88
+ その判断で正しいように思います。
89
+ 返り値を三つ以上に分岐させたい場合は、列挙体の利用も視野に入れると良いでしょう。
90
+
91
+ ---
92
+ > 余談ですがC言語の名前のつけ方でよりよく使われるのは次の二つのどちらでしょうか、またそれ以上に使われる名前の付け方はあるでしょうか。最もオーソドックスなやり方を覚えておきたいんです
93
+ xxxYyy(文字の区切りに大文字)、xxx_yyy(文字の区切りに_)
94
+
95
+ xxx_yyyが一般的ですね。[『C言語 命名規則』でググると](https://www.google.co.jp/search?q=C%E8%A8%80%E8%AA%9E+%E5%91%BD%E5%90%8D%E8%A6%8F%E5%89%87)色々な意見が見られます。
96
+
97
+ |名称|Cでの用途|別名|
98
+ |:--|:--|:--|
99
+ |PascalCase||UpperCamelCase|
100
+ |camelCase||lowerCamelCase|
101
+ |snake_case|変数、関数|snail_case|
102
+ |UPPER_SNAKE_CASE|マクロ|UPPER_SNAIL_CASE|
103
+
104
+ 他にも**プレフィックス**(アプリケーションハンガリアン)を知っておくと彩りが増えます。
105
+ 今見てもピンとこないかもしれませんが: [間違ったコードは間違って見えるようにする](http://local.joelonsoftware.com/wiki/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B)
106
+
107
+ あとは、**動詞形と名詞形の使い分け**ですね。
108
+ 関数に動詞、変数に名詞、配列には複数形名詞を付けると見通しが良くなります。
109
+ また、論理値を返す関数名をis, can, hasなどで始める人が多いです。
110
+
111
+ 命名規則は状況によって変わり得ます。
112
+ チームで開発をしているのならチームの規則に合わせるべきです。
113
+ 個人で開発をする際には、充分なメリットが説明できれば特殊な規則に従っても良いでしょう。

2

追記

2018/02/02 09:14

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -39,6 +39,7 @@
39
39
  ```
40
40
 
41
41
  不正な入力に対して脆弱(というかスルー)ですが、それはまた別の話です。
42
+ あと面倒なので桁あふれの可能性も無視してます。
42
43
 
43
44
  ---
44
45
  > cのif文の条件分岐では ... 真偽を明示すべきか

1

修正

2018/02/01 15:44

投稿

LouiS0616
LouiS0616

スコア35680

answer CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  ######**『小さい』とはどんな尺度で?**
16
16
  これに関しましては、名前に意味を含めた方が良いかと思います。
17
- なぜなら、今後の拡張によっては、**その両方を実装する場合も考えられるからです。**
17
+ なぜなら、今後の拡張によっては、**その複数を実装する場合も考えられるからです。**
18
18
 
19
19
  辞書順の場合、`???_in_lexical_order` (これはただのstrcmpと同じ)
20
20
  数値順の場合、`???_in_numerical_order`などが考えられるでしょう。