アカウント名:
パスワード:
きっかけはこのおもしろい(オブラートに包んだ表現)ツイートではないかな
https://twitter.com/fnya/status/1192036095820615680 [twitter.com]
return (条件)? true : false; なんて書くくらいなら return 条件; だよなあそりゃレビューで落とすでしょ感
return ok ? true : false;なら俺でも怒るがreturn b*b-4*a*c >= 0 ? true : false;なら怒らない
動的型付けだったり、型推論したりの場合はreturn f(x);よりreturn f(x) ? true : false;のことのほうがありがたい場合があるとくにf(x)を他人が定義していて、しかもtrueとfalse以外を帰す場合
とくにf(x)を他人が定義していて、しかもtrueとfalse以外を帰す場合
return (f(x)!=0);みたいに書けばいいと思う。
Cだと関係演算子の結果はintの値なので、return する関数の型がboolだったりすると暗黙的な型変換が行われることになるので気持ちが悪い。条件演算子を使うかで true か false を返すようした方が良いと思う。
C99で導入されたbool(_Bool)では、false/trueはintなので、結局三項演算子を使ってtrue/falseにしても、_Boolへの暗黙の型変換は行われてしいますよ。一方、C++で導入されたboolの場合は、比較演算子はbool型を返すので、三項演算子を使わなくても暗黙の型変換は行われない結局、C99でもC++でも、「cond ? true : false」したからといって型の取り扱いは何も変わらない。
それに、暗黙の型変換がいやだというなら、明示的に型キャストすればいいだけ。そこで三項演算子を使うのは「言語処理系が提供する型キャスト機能があるのに、同等のコードを手で書く」という車輪の再発明で、無駄にバグの元になりかねない。
C99で導入されたbool(_Bool)では、false/trueはintなので、
仕様としては stdbool.h に定義されてるのは論理型 bool と論理値 true と false だからそれを使うべきだよ。
C99では、_Bool型が新たに作られた。0と1しか値をとらない、intとは別の型stdbool.hで、bool は _Boolと定義されている。stdbool.hで、true/falseは、1/0と定義されている。int型の定数。
なので、「bool a = true;」とかやっても、intから_Boolへの暗黙の型変換が行われる、という話ですよ。
stdbool.h に定義されてる true と false は論理値として用意されてるものなので bool のオブジェクトに代入するのは安心してできますね。対して、算術演算の結果が 0 や 1 になるからといって bool のオブジェクトにそれを代入するのは不安が残ります。演算の取りうる組み合わせをすべて検証したとしてもこの不安をなくすことはできないと思います。
C99では、先に「比較演算子は、真なら1、偽なら0になる」という仕様があって、それにあわせて、後からtrueとfalseが定義されている(だから、true/falseは_Bool型ではなく、int型の定数になってる)。
だから、言語仕様上、比較演算子がtrueかfalseを返すのは明白。「a > b ? true : false」みたいに、「trueかfalseな値」を元に「trueかfalseに仕分ける」のは無駄でしかない。そうしないと「不安が残」るようでは、C言語への理解が浅いだけでしょう。
「a+b ? true : false」みたいなコードなら、「明示的にbool化する」という意図は分からないでもない。でも、このコードは車輪の再発明。「(bool)(a+b)」の方が意図が明確。
When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.
という言語仕様でも不安がなくならないって、強迫神経症か何かなの?
otherwise, the result is 1.
int hoge(int i){ bool b = i; return b == i;}が常に 1 返す保証でもない限りはスカラ値から論理型への変換は避けるべき。
ごめん、その保証がないと何が不安なの?
あんたでもtrueとfalseのかわりに全部1と0で書いてあるコードや、変数名がぜんぶ連番のコードを読まされたら怒るだろ?プログラミング言語の意味論と、人間にどう見えるかは全然別の話だよプログラミング脳になっちゃってるのか、頭が悪いやつはごっちゃにしてるけどな
味噌も糞も一緒な人に説明する意味がどれだけあるやら
そうだよな。もともと人間にどう見えるかという話なのに、暗黙的な型変換は避けるべきとか、stdbool.hに定義されているtrueとfalseを使うべきとか言い始めるからおかしくなる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
※ただしPHPを除く -- あるAdmin
発端? (スコア:3, 参考になる)
きっかけはこのおもしろい(オブラートに包んだ表現)ツイートではないかな
https://twitter.com/fnya/status/1192036095820615680 [twitter.com]
Re: (スコア:0)
return (条件)? true : false; なんて書くくらいなら return 条件; だよなあ
そりゃレビューで落とすでしょ感
Re: (スコア:0)
return ok ? true : false;
なら俺でも怒るが
return b*b-4*a*c >= 0 ? true : false;
なら怒らない
Re: (スコア:0)
動的型付けだったり、型推論したりの場合は
return f(x);
より
return f(x) ? true : false;
のことのほうがありがたい場合がある
とくにf(x)を他人が定義していて、しかもtrueとfalse以外を帰す場合
Re: (スコア:1)
return (f(x)!=0);
みたいに書けばいいと思う。
Re: (スコア:0)
Cだと関係演算子の結果はintの値なので、return する関数の型がboolだったりすると暗黙的な型変換が行われることになるので気持ちが悪い。条件演算子を使うかで true か false を返すようした方が良いと思う。
Re: (スコア:1)
C99で導入されたbool(_Bool)では、false/trueはintなので、結局三項演算子を使ってtrue/falseにしても、_Boolへの暗黙の型変換は行われてしいますよ。
一方、C++で導入されたboolの場合は、比較演算子はbool型を返すので、三項演算子を使わなくても暗黙の型変換は行われない
結局、C99でもC++でも、「cond ? true : false」したからといって型の取り扱いは何も変わらない。
それに、暗黙の型変換がいやだというなら、明示的に型キャストすればいいだけ。
そこで三項演算子を使うのは「言語処理系が提供する型キャスト機能があるのに、同等のコードを手で書く」という車輪の再発明で、無駄にバグの元になりかねない。
Re: (スコア:0)
C99で導入されたbool(_Bool)では、false/trueはintなので、
仕様としては stdbool.h に定義されてるのは論理型 bool と論理値 true と false だからそれを使うべきだよ。
Re:発端? (スコア:1)
C99では、
_Bool型が新たに作られた。0と1しか値をとらない、intとは別の型
stdbool.hで、bool は _Boolと定義されている。
stdbool.hで、true/falseは、1/0と定義されている。int型の定数。
なので、「bool a = true;」とかやっても、intから_Boolへの暗黙の型変換が行われる、という話ですよ。
Re: (スコア:0)
stdbool.h に定義されてる true と false は論理値として用意されてるものなので bool のオブジェクトに代入するのは安心してできますね。
対して、算術演算の結果が 0 や 1 になるからといって bool のオブジェクトにそれを代入するのは不安が残ります。演算の取りうる組み合わせをすべて検証したとしてもこの不安をなくすことはできないと思います。
Re:発端? (スコア:1)
C99では、先に「比較演算子は、真なら1、偽なら0になる」という仕様があって、それにあわせて、後からtrueとfalseが定義されている(だから、true/falseは_Bool型ではなく、int型の定数になってる)。
だから、言語仕様上、比較演算子がtrueかfalseを返すのは明白。「a > b ? true : false」みたいに、「trueかfalseな値」を元に「trueかfalseに仕分ける」のは無駄でしかない。そうしないと「不安が残」るようでは、C言語への理解が浅いだけでしょう。
「a+b ? true : false」みたいなコードなら、「明示的にbool化する」という意図は分からないでもない。でも、このコードは車輪の再発明。「(bool)(a+b)」の方が意図が明確。
Re: (スコア:0)
という言語仕様でも不安がなくならないって、強迫神経症か何かなの?
Re: (スコア:0)
otherwise, the result is 1.
int hoge(int i)
{
bool b = i;
return b == i;
}
が常に 1 返す保証でもない限りはスカラ値から論理型への変換は避けるべき。
Re: (スコア:0)
ごめん、その保証がないと何が不安なの?
Re: (スコア:0)
あんたでもtrueとfalseのかわりに全部1と0で書いてあるコードや、変数名がぜんぶ連番のコードを読まされたら怒るだろ?
プログラミング言語の意味論と、人間にどう見えるかは全然別の話だよ
プログラミング脳になっちゃってるのか、頭が悪いやつはごっちゃにしてるけどな
Re: (スコア:0)
味噌も糞も一緒な人に説明する意味がどれだけあるやら
Re: (スコア:0)
そうだよな。もともと人間にどう見えるかという話なのに、暗黙的な型変換は避けるべきとか、stdbool.hに定義されているtrueとfalseを使うべきとか言い始めるからおかしくなる。