947です ごめんなさい 値返しだったみたいですね
>948 そーいうことはせめて (a?b:c) = 4; を実行してみてから言うべきじゃね? > 14882:2003 5.16/4 > If the second and third operands are lvalues and have the same type, the result is of that type and is an > lvalue. なので a?b:c なら左辺値が返るので代入はそのまま動作する。 >949 >実際に、cの値を返させると4でなく3が返ってくるだろう。 a?b:(c=4) で a は真になるから c=4 は評価されない。 >950 構文的に > conditional-expression: > logical-or-expression > logical-or-expression ? expression : assignment-expression > assignment-expression: > conditional-expression > logical-or-expression assignment-operator assignment-expression > throw-expression logical-or-expression はもっと優先順位の高い演算子を含む式ね。 assignment-expression の左辺には logical-or-expression 以上のものしか現れないので、 conditional-expression が直接現れることはできない。 一方、conditional-expression の第2、第3引数には assignment-expression が現れることが可能 (expression は任意の式を含む)。 conditional-expression が三項演算子なので二項演算子等の単純な優先順位の話とは異なるということだと思われ。
>>951 左辺値をそういう指定しちゃダメじゃないか?
想像や憶測で答えるなよ……。 規格票で条件演算子のところを見てみようぜ。 > 5.16 二択条件演算子 > 二択条件式: > 論理和式 > 論理和式 ? 式 : 代入式 コロンの後ろには代入式が来ると定義されているのでa ? b : c = 4はa ? b : (c = 4)と解釈される。 条件演算子が代入演算子より優先順位が高いというのは「a = c ? 1 : 2」のような場合。 なお、C++では括弧付けて(a ? b : c) = 4と書けば、bまたはcに4が代入されるという意味になる。 ANSI Cと違ってbとcが同じ型の左辺値なら、条件式の結果も左辺値になるためエラーにならない。
956 :
948 :2009/05/04(月) 13:10:19
本当だ、規格引いてなかった。 吊ってくる。
>>953 >>955 ありがとうございます。
演算子には単に優先順位と結合規則以外にも
いろいろなルールがあるんですね。
すごく複雑。
あるクラスのprivateメンバとして 同時にアクセスされない2つのメンバ変数int iとchar cがあるとき、 これらをunionでまとめるとメモリが節約できるとの事だけど、 これは代償として遅くなる? structでまとめた方が速かったりする?
959 :
デフォルトの名無しさん :2009/05/04(月) 14:39:44
遅くならない。 速くない。
961 :
960 :2009/05/04(月) 14:44:33
×unionのが言い訳 ○unionのが良いわけ
>同時にアクセスされない2つのメンバ変数int iとchar cがあるとき、 この言葉で,unionの危険性は回避されない
963 :
デフォルトの名無しさん :2009/05/04(月) 14:47:43
964 :
デフォルトの名無しさん :2009/05/04(月) 14:49:27
>>958 メンバ変数int iを持つクラスと、char cを持つクラスを別に作った方がいいんじゃない?
ヒント。変数は値を保存する機能が本質だ。アクセスは、それを見るだけ。
966 :
デフォルトの名無しさん :2009/05/04(月) 14:50:40
ヒントは要らないから、具体例を。
うまく説明できないから、「ヒント」と言ってごまかしているわけで。 あまりいじめるなww
賢いあなたが、代わりに説明をどうぞ
969 :
960 :2009/05/04(月) 14:53:12
>>962 2つのメンバ変数int iとchar cに同時にアクセスせず、
その値を取り出す時は現在どちらの値として入っているのかを
ちゃんとチェックして取り出すつもりだったんだが
それだけではunionは危険なのかい?
俺はこの条件で大丈夫だと思っていたのだが。。。
970 :
デフォルトの名無しさん :2009/05/04(月) 14:54:17
危険じゃないよ。
971 :
960 :2009/05/04(月) 14:55:32
>>970 だよね。
別にビット列を利用して適当な型の最初の1バイトだけ覗こうとか
そうゆうこともするつもりないし。
>その値を取り出す時は現在どちらの値として入っているのかを >ちゃんとチェックして取り出すつもりだったんだが この説明が入っていれば問題はない。 後出しじゃんけんんの勝利おめでとw
世の中には、union、gotoと聞くだけで、脊椎反射で危険危険と言う奴がいるからw
次はレッテル張りか、おめでたいやつ
後だしジャンケンのレッテル貼りか、おめでたいなw
976 :
960 :2009/05/04(月) 14:59:13
>>972 煽らないでくれよ、
俺は喧嘩したいわけじゃないんだ。
みんな仲良くしてくれ、俺の質問のために喧嘩しないでくれ。
教えてくれた人たちありがとう。
>>969 そういう仕様がほしいなら、boost::variantを授けよう。
>>973 知って使えば有用だし、濫用すれば毒になる。
毒にも薬にもなるって典型だよね。
979 :
960 :2009/05/04(月) 15:04:56
>>977 boost::variantってあったねぇ。
便利そうだが、遅くならないか心配な面もある。
遅くなるわ、メモリが節約できないわ、もうね。
>>980 あれってメモリ節約できないんか。
じゃあ一方を有効にした時 他方へアクセスできないようにしなきゃならない事情のある時に使う代物か。
>>969 チェック処理を入れるなら、チェック処理の分遅くなるんじゃない?
要素が巨大なstruct2つとかだったら節約になるかもしれないが、intとcharなら使用メモリは確実に増えるね。
984 :
960 :2009/05/04(月) 15:13:03
>>982 必ずしもチェック処理入れるつもりはありません。
状況次第で確実にどちらか判別付くならチェック処理しません。
例えばある関数fooから呼び出した時はunionのint xの方へアクセスすることが確実で、
しかも前後関係からunionのint xが必ず有効だと分かっているなど。
985 :
960 :2009/05/04(月) 15:13:59
>>983 ああ、intとcharは引き合いに出しただけで、デカめの自作クラスを入れるつもり。
ならunionでいいね。boost持ち出すまでもない。
流れ無視、それで節約されるメモリに余計なコードと管理の手間を増やすことに見合うほどの価値があるのか?。
988 :
デフォルトの名無しさん :2009/05/04(月) 15:47:19
メモリに余計なコードと管理の手間がなければ、節約された方がいいでしょう。
>>987 価値があるかどうかはその人の価値観と状況の差だと思う。
組み込み系だったりするとまた話も違うだろう。
>>985 クラスならPODじゃないと入れられないから気を付けろよ
>>987 チェックされるならデバッグが簡単になる。
>>990 そういやそんな制限もあったなぁ。unionなんて久しく使ってなかった。
次スレは誰が建ててくれる?
multisetのoperator>ってどういう動作ですか? もしくはそう言ったのが分かる参考サイト教えてくださいませんか?
999get
人生初の1000をとりましたよ。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。