ふと思ったのだが、4項以上の演算子ってどんなんだろうか?
>>351 が気持ち悪いのは同意だが
>>352 はもっと気持ち悪い。perlみたい。
てか
>>351ってバグってねえか?
return p ? p->foo() : 0;
ならわかるが。
気持ち悪い書き方をした報いが早速出てるって訳だ。
>>355 すまんw ばぐってる、書いた直後に赤面した。
returnを一行にしたいために三項演算子使うの、
俺にとっては少しも気持ち悪くない。
if p
return p->foo()
else
return 0;
return が 2 つに分かれるのがよくない。
あるいは、
int r;
if p
r = p->foo()
else
r = 0;
return r;
変数が増える。
冗長であることを気持ち悪いと思わない奴は好きにしな、って感じ。
>>355 >>352 は C の伝統的、かつまっとうな記述。
>>357 >return が 2 つに分かれるのがよくない。
かどうかは各自あるいは各職場にて判断汁。
>>352 は例えば
while (p && p->foo()) {
...
のように使えるしな。PerlはCからこれを引き継いだだけ。
>>352 351と352はかなり違うだろ。
評価結果を真偽判定に利用する場合は同じだけど。
351の書き方は、難しくは無いが珍しいと思われ。
>>362 Cの話でいいんだよな?
p->foo()の戻り値がintでない場合、?:演算子の
戻り値はその型になるだろ。
ところが&&だったらかならずint。
Cでboolだってwww
つ _Bool
このアホコテまだ生きてたのか
int foo(void){return 2;}
struct MyStruct{
int(*foo)()
};
struct MyStruct t, *p;
t.foo = foo;
p = &t;
のように定義されてるとき、
p?p->foo():0は2
p && p->foo()は1
になるはず。
(Cにおいて、真偽値を返す演算子は真のとき1, 偽のとき0を返す)
超亀なので書くのも気が引けるが
p && p->foo();
って、pが0のときp->foo()ですっ飛ぶだろ
>超亀なので書くのも気が引けるが
別の意味でやめておくべきだったな。
昔、言語仕様とかコンパイラオプションとか壮大な議論になったような記憶がないでもない
放置スレなのに突っ込み早いな
短絡評価って名前は知らなかった。
しかも&&は右から評価すると思ってた。
やべー
msのコンパイラは右から、
gccとかは左から。
だっけ?
VBは問答無用だけどな。
それが本当だとしたらおそろしい規格の無視だな。
演算子の評価純度と、
関数の引数の評価順序を
ごっちゃにしちゃう奴っているよね
>>379 それだったらごっちゃでおk。w
評価順とか結合規則とか優先順位とか、
ごっちゃにしちゃう奴っているよね。
ていうか、Cの演算子のなかで && と || が特別。
383 :
仕様書無しさん:2010/05/07(金) 17:58:08
C++だと論理演算子やビット演算子を上書きできてデフォルトの演算子の優先順が適用されない罠があるけどな。
こういうのがC++の嫌われる一因だ。
ラベルとgotoを使うのが一番スマートだと思うのだが。
gotoは絶対に使っちゃ行けない教の人でなければ。
386 :
仕様書無しさん:2010/05/08(土) 00:47:55
public static void main(String[] args) {
try {
main(null);
} catch (StackOverflowError e) {
main(null);
}
}
三項演算子、よく使うなぁ。
int i = 0;
if (ex == 0)
{
i = 100;
}
else
{
i = 1000;
}
って書くと、どこかでiが0の可能性があるのかな?、と心にひっかかる。
int i = (ex == 0) ? 100 : 1000;
これだとiは100か1000しか入らないという安心感がある。個人的に。
みんな口にはしてないけど見辛いのかなぁ。
じゃあこう書けばいいじゃない。
int i = 100;
if(ex) i = 1000;
というか 387 は代入した 0 が使われていないと警告が出るだろ。
i を宣言時に初期化しなければ、その不安は発生せず、未初期化で使われていないかコンパイラの警告をチェックすれば済む。
まあ俺は i を const で宣言して三項演算子使うけどね。
> みんな口にはしてないけど見辛いのかなぁ。
意味不明。
constは使うな。
>>388 確かにそういうなんだけど、そう書けない場合もあって。
class base {};
class A : public base {};
class B : public base {};
base p = (ex == 0) ? new A() : new B();
みたいな。
まぁ使いたくないワケじゃなく、容認してもらいたいだけなんだ。
ただ、どうしても使ってはいけない理由みたいのがあるなら
自粛しなきゃなぁという気持ち。
while('-')
for(;;)派だけどな
while(0==0)
while(true)
だけどあんまりループは使わんな
for(;;)のほうが早いんじゃないの?
今時のコンパイラなら間違いなく同じコードを吐く、はず。
warning C4127: 条件式が定数です。
が出た
もし、真が0の環境があったらと考えると、for(;;)の方が落ち着く。
あとwhileで!0じゃなく、1と書かれるのがなんか嫌。
5000だろうが0以外なら何使ってもいいのに。
それは規格的に、C言語ではありませんが。
while(!0x0)
while(1)ってpointer->memberを
pointer[0].memberって書いてるのと同じ感じでキモイ
while (0==0)
いつだったかマ板のどっかのスレで
for(;;)を使って首吊りAA書いたのがいたっけな