C++相談室 part66

このエントリーをはてなブックマークに追加
952デフォルトの名無しさん:2009/05/04(月) 12:54:05
947です ごめんなさい 値返しだったみたいですね
953デフォルトの名無しさん:2009/05/04(月) 12:59:13
>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 が三項演算子なので二項演算子等の単純な優先順位の話とは異なるということだと思われ。
954デフォルトの名無しさん:2009/05/04(月) 12:59:42
>>951
左辺値をそういう指定しちゃダメじゃないか?
955デフォルトの名無しさん:2009/05/04(月) 13:00:58
想像や憶測で答えるなよ……。
規格票で条件演算子のところを見てみようぜ。
> 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が同じ型の左辺値なら、条件式の結果も左辺値になるためエラーにならない。
956948:2009/05/04(月) 13:10:19

本当だ、規格引いてなかった。
吊ってくる。
957デフォルトの名無しさん:2009/05/04(月) 13:16:04
>>953 >>955
ありがとうございます。
演算子には単に優先順位と結合規則以外にも
いろいろなルールがあるんですね。
すごく複雑。
958デフォルトの名無しさん:2009/05/04(月) 14:37:23
あるクラスのprivateメンバとして
同時にアクセスされない2つのメンバ変数int iとchar cがあるとき、
これらをunionでまとめるとメモリが節約できるとの事だけど、
これは代償として遅くなる?
structでまとめた方が速かったりする?
959デフォルトの名無しさん:2009/05/04(月) 14:39:44
遅くならない。
速くない。
960デフォルトの名無しさん:2009/05/04(月) 14:42:42
>>959
じゃあunionのが言い訳か。thx
961960:2009/05/04(月) 14:44:33
×unionのが言い訳
○unionのが良いわけ
962デフォルトの名無しさん:2009/05/04(月) 14:46:48
>同時にアクセスされない2つのメンバ変数int iとchar cがあるとき、
この言葉で,unionの危険性は回避されない
963デフォルトの名無しさん:2009/05/04(月) 14:47:43
>>962
具体的に。
964デフォルトの名無しさん:2009/05/04(月) 14:49:27
>>958
メンバ変数int iを持つクラスと、char cを持つクラスを別に作った方がいいんじゃない?
965デフォルトの名無しさん:2009/05/04(月) 14:50:11
ヒント。変数は値を保存する機能が本質だ。アクセスは、それを見るだけ。
966デフォルトの名無しさん:2009/05/04(月) 14:50:40
ヒントは要らないから、具体例を。
967デフォルトの名無しさん:2009/05/04(月) 14:51:29
うまく説明できないから、「ヒント」と言ってごまかしているわけで。

あまりいじめるなww
968デフォルトの名無しさん:2009/05/04(月) 14:52:38
賢いあなたが、代わりに説明をどうぞ
969960:2009/05/04(月) 14:53:12
>>962
2つのメンバ変数int iとchar cに同時にアクセスせず、
その値を取り出す時は現在どちらの値として入っているのかを
ちゃんとチェックして取り出すつもりだったんだが
それだけではunionは危険なのかい?
俺はこの条件で大丈夫だと思っていたのだが。。。
970デフォルトの名無しさん:2009/05/04(月) 14:54:17
危険じゃないよ。
971960:2009/05/04(月) 14:55:32
>>970
だよね。
別にビット列を利用して適当な型の最初の1バイトだけ覗こうとか
そうゆうこともするつもりないし。
972デフォルトの名無しさん:2009/05/04(月) 14:56:16
>その値を取り出す時は現在どちらの値として入っているのかを
>ちゃんとチェックして取り出すつもりだったんだが
この説明が入っていれば問題はない。
後出しじゃんけんんの勝利おめでとw
973デフォルトの名無しさん:2009/05/04(月) 14:56:22
世の中には、union、gotoと聞くだけで、脊椎反射で危険危険と言う奴がいるからw
974デフォルトの名無しさん:2009/05/04(月) 14:58:00
次はレッテル張りか、おめでたいやつ
975デフォルトの名無しさん:2009/05/04(月) 14:59:12
後だしジャンケンのレッテル貼りか、おめでたいなw
976960:2009/05/04(月) 14:59:13
>>972
煽らないでくれよ、
俺は喧嘩したいわけじゃないんだ。
みんな仲良くしてくれ、俺の質問のために喧嘩しないでくれ。
教えてくれた人たちありがとう。
977デフォルトの名無しさん:2009/05/04(月) 15:02:29
>>969
そういう仕様がほしいなら、boost::variantを授けよう。
978デフォルトの名無しさん:2009/05/04(月) 15:04:43
>>973
知って使えば有用だし、濫用すれば毒になる。

毒にも薬にもなるって典型だよね。
979960:2009/05/04(月) 15:04:56
>>977
boost::variantってあったねぇ。
便利そうだが、遅くならないか心配な面もある。
980デフォルトの名無しさん:2009/05/04(月) 15:06:15
遅くなるわ、メモリが節約できないわ、もうね。
981デフォルトの名無しさん:2009/05/04(月) 15:08:49
>>980
あれってメモリ節約できないんか。
じゃあ一方を有効にした時 他方へアクセスできないようにしなきゃならない事情のある時に使う代物か。
982デフォルトの名無しさん:2009/05/04(月) 15:10:15
>>969
チェック処理を入れるなら、チェック処理の分遅くなるんじゃない?
983デフォルトの名無しさん:2009/05/04(月) 15:11:39
要素が巨大なstruct2つとかだったら節約になるかもしれないが、intとcharなら使用メモリは確実に増えるね。
984960:2009/05/04(月) 15:13:03
>>982
必ずしもチェック処理入れるつもりはありません。
状況次第で確実にどちらか判別付くならチェック処理しません。
例えばある関数fooから呼び出した時はunionのint xの方へアクセスすることが確実で、
しかも前後関係からunionのint xが必ず有効だと分かっているなど。
985960:2009/05/04(月) 15:13:59
>>983
ああ、intとcharは引き合いに出しただけで、デカめの自作クラスを入れるつもり。
986デフォルトの名無しさん:2009/05/04(月) 15:15:12
ならunionでいいね。boost持ち出すまでもない。
987デフォルトの名無しさん:2009/05/04(月) 15:45:03
流れ無視、それで節約されるメモリに余計なコードと管理の手間を増やすことに見合うほどの価値があるのか?。
988デフォルトの名無しさん:2009/05/04(月) 15:47:19
メモリに余計なコードと管理の手間がなければ、節約された方がいいでしょう。
989デフォルトの名無しさん:2009/05/04(月) 15:52:23
>>987
価値があるかどうかはその人の価値観と状況の差だと思う。
組み込み系だったりするとまた話も違うだろう。
990デフォルトの名無しさん:2009/05/04(月) 16:06:13
>>985
クラスならPODじゃないと入れられないから気を付けろよ
991デフォルトの名無しさん:2009/05/04(月) 16:19:24
>>987
チェックされるならデバッグが簡単になる。
992デフォルトの名無しさん:2009/05/04(月) 16:31:25
>>990
そういやそんな制限もあったなぁ。unionなんて久しく使ってなかった。
993デフォルトの名無しさん:2009/05/04(月) 16:44:28
次スレは誰が建ててくれる?
994デフォルトの名無しさん:2009/05/04(月) 17:04:38
multisetのoperator>ってどういう動作ですか?
もしくはそう言ったのが分かる参考サイト教えてくださいませんか?
995デフォルトの名無しさん:2009/05/04(月) 17:17:31
>>993
1001以後が立てる
996デフォルトの名無しさん:2009/05/04(月) 21:07:11
取り急ぎ立てました。
part63, part66 が重複していたようですのでとりあえず part69 としました。
スレ番、次スレ誰が立てるか、テンプレ等は適当に議論してもらえればと思います。

C++相談室 part69
http://pc12.2ch.net/test/read.cgi/tech/1241438694/
997デフォルトの名無しさん:2009/05/04(月) 21:10:42
>>996
ありがとう!
998デフォルトの名無しさん:2009/05/04(月) 21:11:06
>>996
999デフォルトの名無しさん:2009/05/04(月) 21:23:42
999get
1000デフォルトの名無しさん:2009/05/04(月) 21:24:53
人生初の1000をとりましたよ。
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。