【C】カンマ演算子を極めるスレ【C++】

このエントリーをはてなブックマークに追加
166デフォルトの名無しさん:2005/09/15(木) 03:01:58
>>165
誰もそのマクロにバグがあるとは言ってないだろ
167デフォルトの名無しさん:2005/09/15(木) 03:06:41
>>166
誰も許されるとは言ってないだろ
168デフォルトの名無しさん:2005/09/15(木) 03:14:25
「仕様」だと主張することは「許される」ことと同義だと思うが。
169デフォルトの名無しさん:2005/09/15(木) 03:20:23
166=168 なら矛盾したことを言ってるぞ。
170デフォルトの名無しさん:2005/09/15(木) 03:26:43
>>169
説明キボン
171デフォルトの名無しさん:2005/09/15(木) 03:39:38
>>170
定義1:仕様であるならバグではない。( >>159 )
定義2:誰もバグがあるとは言っていない( >>166 )
定義3:仕様であれば許される。( >>168 )

定義1と定義3から「バグがあるから許されない」となるが、定義2と矛盾する。

ただし、166=168が定義1そのものを否定するならば矛盾はしていない。
しかし、定義1はバグの定義として一般的に広く浸透している考えなので、
166=168が定義1を否定していないものと仮定した。
172デフォルトの名無しさん:2005/09/15(木) 03:55:47
定義2は完全に肯定する。(俺自身の言葉だし)
定義1は肯定するが今回の話とは無関係。>>160は俺。

なんで定義1と定義3から「バグがあるから」の言葉が出てくるのかわからん。
173デフォルトの名無しさん:2005/09/15(木) 19:37:36
インライン関数にすりゃいいものを、どーしてマクロでやりたがるの?

同じことを実現する2つのやり方があった場合、
より良い方を選ばないのは、どうしてだい?
174デフォルトの名無しさん:2005/09/15(木) 19:45:08
Cだから。
175デフォルトの名無しさん:2005/09/15(木) 21:53:25
>>173
Cには参照渡しがないから関数でやろうとするとポインタ渡しになる。
俺はそれでもインライン関数にするけどな。
176デフォルトの名無しさん:2005/09/15(木) 22:31:26
俺はC++の参照渡しを安易に使うのには反対だ。constを適切に使えばいい、という人もいるけどさ。

CFoo oFoo ;
hogehoge(oFoo) ;

とやった場合に、呼んだ側からは、実体渡しなのか参照渡しなのか、わからないのだ。
177デフォルトの名無しさん:2005/09/15(木) 22:32:26
>>174
よりよいCとしてC++を使えない、
純粋なCで書かないといけない、という制限があるなら、しかたないね。

178デフォルトの名無しさん:2005/09/15(木) 22:32:37
>>176
わからなくさせるための参照渡しですから。
179デフォルトの名無しさん:2005/09/15(木) 23:46:10
参照か否かではなく、変更されるのかされないのかが問題
180デフォルトの名無しさん:2005/09/15(木) 23:54:53
だからconstを適切に使えばいい
代入演算子をオーバーロードするときは参照をconstなしで渡すけどね
181デフォルトの名無しさん:2005/09/16(金) 00:00:20
関数の引数にするときは必ずconst_cast<const T>せよということですか
182デフォルトの名無しさん:2005/09/16(金) 00:07:46
そこでboost::crefですよ
183デフォルトの名無しさん:2005/09/17(土) 00:06:29
>>181
まともなライブラリを使えということです。
今時のまともなC/C++ライブラリは変更しない引数にはconstがついてますから。
まともじゃないライブラリを使ってる場合はinline関数でラッパーライブラリでもいいです。
醜いconst_castが一箇所に収まりますから。
184デフォルトの名無しさん:2005/09/17(土) 00:25:03
おまいら const の話ならこっちでしてくれ。過疎ってるんだ、頼む。

【C++】 const だけでメシが3杯食えちゃうスレ
http://pc8.2ch.net/test/read.cgi/tech/1078193971/
185デフォルトの名無しさん:2005/09/17(土) 00:47:05
186デフォルトの名無しさん:2005/09/17(土) 00:52:51
template みたいな大きな機能だけでなくカンマやら const やらの小ネタで独立したスレが立ってしまうのもC++ならではだよなぁ。
187ミノル小早川:2005/09/17(土) 01:13:27
よし、おれいまから"register指定詞だけでギャルにモテモテになるスレ"立ててくる!!
188デフォルトの名無しさん:2005/09/17(土) 01:24:21
∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵。∴∵
∴∵∴∵:。∴∵∴∵∴: --─- ∴∵∴∵∴∵∴∵
∴∵゜∴∵∴∵∴∵  (___ )(___ ) ∴∵。∴∵∴∵ ゜
∴∵∴∵∴:∵∴∵_ i/ = =ヽi ∴∵∴∵。∴∵∴
∴∵☆彡∴∵∵ //[||    」  ||] ∵∵∵∵∴:∵∴∵
∴∵∴∵∴∵ / ヘ | |  ____,ヽ | | ∴:∵∴∵∴∵:∴∵
∴゚∴∵∴∵ /ヽ ノ    ヽ__./  ∴∵∴∵:∴∵∴∵
∴∵∴∵  く  /     三三三∠⌒> ∴:∵∴∵:∴∵
∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∵∵∴∵∴∵
   ∧∧   ∧∧  ∧∧   ∧∧
  (   )ゝ (   )ゝ(   )ゝ(   )ゝ ムチャシヤガッテ・・・
   i⌒ /   i⌒ /  i⌒ /   i⌒ /
   三  |  三  |  三  |  三  |
   ∪ ∪  ∪ ∪  ∪ ∪  ∪ ∪
  三三   三三  三三  三三
189デフォルトの名無しさん:2005/09/17(土) 02:07:36
>>183
呼び出しているところだけを見ても、変更される可能性があるかどうか
わからないという話なので、関数がどう宣言されているかは関係ないと思います!

constじゃない参照は使わないというポリシーじゃないと、これの解決策に
なりません!
190デフォルトの名無しさん:2005/09/17(土) 02:35:43
> constじゃない参照は使わないというポリシー

それが良識です。
191デフォルトの名無しさん:2005/09/17(土) 02:42:16
というか常識です。
192デフォルトの名無しさん:2005/09/17(土) 02:47:43
参照は言語仕様からはずしてconst指定すると自動的に参照渡しになるように変更でFA
193デフォルトの名無しさん:2005/09/17(土) 02:59:08
>>192
operator [] () とかを実装できなくなるからダメ。てか、カンマの話をしようぜ。
194デフォルトの名無しさん:2005/09/17(土) 11:59:45
out引数かどうかなんてのは結局ポインタ値渡しだったとしても関数呼び出し見ただけでは判らないんじゃないのか?
195デフォルトの名無しさん:2005/09/17(土) 13:19:21
ちょっと前のBlitz++ライブラリでは、カンマ演算子が配列への代入に使われていた。
初めて見たときはちょっと感心した。
196デフォルトの名無しさん:2005/09/17(土) 13:27:14
>>195
>>15, 25

ていうかlistとvectorで定義を分ける必要はないんだが>>25
set, hash_set等でも同じことができるように container_traitsがホスィ
197デフォルトの名無しさん:2005/09/17(土) 15:08:00
昔、計算とリターンを一行でやりたくて、

  return a+=b, b;

って書いたら、bが返却された覚えがあるんだけど
これって正しい記述方法なの?
198デフォルトの名無しさん:2005/09/17(土) 15:14:06
カンマ演算子について調べろ。
199デフォルトの名無しさん:2005/09/17(土) 16:42:23
>>194

とりあえずC言語時代には、
int n ;
foo(n) ;
bar(&n) ;
とあったら、fooはinでbarはoutだよね。

その慣習からすれば、
constの参照で渡す場合はin、ポインタで渡す場合はout、というのが自然じゃないか?
200デフォルトの名無しさん:2005/09/17(土) 17:00:00
多値をカンマで返す処理系(perlやluaなど)はカンマ演算子ないよな
201デフォルトの名無しさん:2005/09/17(土) 17:39:38
LISPなら prognがカンマ演算子に近いかな。

(progn 式1 式2 … 式n)
式1 から式n を順に評価して式nの値を返す。
202デフォルトの名無しさん:2005/09/17(土) 17:49:09
するとCは複文を式中に書けないのが原因だな
GCCではできるんだが
203デフォルトの名無しさん:2005/09/17(土) 20:27:10
>>199
const * でもない限りは in/outかoutとは考えても out onlyとは先ず想定しないだろ。
foo(int &n)の場合、inの見た目を持ったoutかも知れない、というのはあるが、それはbar(int *n)だって同じこと。
引数でデータ返そうとする時点で紛らわしくなるのはもう仕方のないことだろう。

204デフォルトの名無しさん:2005/09/17(土) 20:37:32
>>203
ちょっとはスレの前のほうを読もうぜ
>>176-191
205デフォルトの名無しさん:2005/09/17(土) 22:34:47
空気読めてないのは君だよ…。
206デフォルトの名無しさん:2005/09/17(土) 23:09:27
>>200
カンマに2通りの意味があったらややこしいもんな
何かわかりやすい違い(関数呼び出しとそれ以外、とか)があれば別だが

Schemeの場合
カンマ演算子的なもの:(begin 1 2 3)
多値:(values 1 2 3)

まあ元々プロシージャの中に式は並べて書けるんだが
207デフォルトの名無しさん:2005/09/18(日) 00:29:55
つーかCの引数の区切りも無理にカンマにせんで良かったんでは。
いや、今更変えられたら困るが。
208デフォルトの名無しさん:2005/09/18(日) 00:51:00
>>207
それを言うなら、カンマ演算子に他の記号を使ってもよかったんでは?
てか、そもそもC的にカンマ演算子の必要性が見出せんのだが・・・
C++なら多少はカンマ演算子があるおかげで楽をできる場面があるから
わからんでもないんだが。
209デフォルトの名無しさん:2005/09/18(日) 00:58:40
returnやgotoが「文」なのがいけないと思う
throwは「式」なのに・・
いっそのこと全部式にしてしまって、return文廃止にしたらどうだろうか。
・・まあ妄想はここまでにしておこう。
210デフォルトの名無しさん:2005/09/18(日) 01:04:05
return は文のままでも、
return (a) ;
とかって書けるじゃないか。

関数の引き数だって、foo( (a, b, c), d) とか書けるんじゃないか?
211デフォルトの名無しさん:2005/09/18(日) 01:06:09
そんなのわかってるよ^^
だから何?^^
212デフォルトの名無しさん:2005/09/18(日) 09:04:17
>>209
return式の評価中にreturn式やgoto式が出たときの動作をどうするんだろ・・・

return flg ? (return a) : (goto lbl) みたいな奴
213デフォルトの名無しさん:2005/09/18(日) 09:07:58
>>212
コンパイルしてみればわかる。
214デフォルトの名無しさん:2005/09/18(日) 21:17:06
>>212
throwの結果の型は確かvoidだったと思う。
それと同じようにreturnやgotoも結果の型をvoidにしてしまえばいい。
215デフォルトの名無しさん
>>214
ああそうか。C++はreturn void;を許していたんだな。最初これを見たときは
(  Д ) 彡 ゜ ゜ポカーンだったが。