VBAの「+演算子」の挙動が怖すぎる
- KotorinChunChun
- 27548
- 86
- 1
- 3
出題
#VBAクイズ Debug.Print "1" + "2" Debug.Print "1" + 2 Debug.Print 1 + "2" Debug.Print -"1" + "2" 上から答えは?
2020-01-24 09:46:42Togetter読者の皆様へ
興味のある方は、自分の答えを出してからこの先をお読みいただくと、より勉強になります。
皆の解答
実際に確かめちゃいましたけど、勉強になりました! あ。投票はしてないです┏○ペコ twitter.com/kotorinchunchu…
2020-01-24 19:41:17@KotorinChunChun これ面白い、というか、良い問題だと思う。 悩む人多い気がしますね。 選択肢なかったら、私もちょっと悩む気がする。
2020-01-24 13:05:03@KotorinChunChun これ、最難関www。ワイも多分、まちがえてるとおもう。。。左型優先変換か型の広さ優先変換かまったくわからんwww。
2020-01-24 12:49:21ヤバイ。全然わかんない。 最初の以外は全部エラーになるんじゃね?って思ったくらい。 なんとなくで一番上を選択。文字列の結合には&を使いたい派です。 twitter.com/KotorinChunChu…
2020-01-24 18:17:00そもそも文字列に&以外の演算子が使えるとは知らなかった。 どういう仕組みなんだろう?演算子が+-*/^のときは、被演算子にCDblでも働かせることになっているのかな? 自作のクラスに対しても、そういう演算子オーバーロードのようなことができるなら、面白そう。 twitter.com/kotorinchunchu…
2020-01-24 18:41:15@KotorinChunChun 帰宅後確認しますけど、演算順序が最初のパラメーターの型で演算が開始されると思うのです。 で、残りのパラメーターは暗黙の型変換される理解。
2020-01-24 16:31:44①が文字列と文字列の結合なのはわかる。 あとは、全部エラー。 と思ったら選択肢がない。。。 twitter.com/KotorinChunChu…
2020-01-24 18:57:54@KotorinChunChun 1は文字列結合 2、3は数値に変換されて演算 4は想像もつかなかったけど、選択肢で4番目を回答しました。
2020-01-24 20:04:14うひゃー、最後のやつ見て4番にしたけど…後で確かめてみよう。ま、こんなコード書かないに越したことはないけどねw。この辺りが暗黙変換の落とし穴だよなあ。 twitter.com/KotorinChunChu…
2020-01-24 21:04:47あまり自信はありませんが、 1.文字列同士の結合なので、+は&と同じ 2と3. 片方が数値だと、数値と判断できる文字列は自動型変換され、計算される 4.よく分かりませんが、文字列にマイナスはないため、数値とみなされた。あとは2と3と同様。 twitter.com/KotorinChunChu…
2020-01-24 21:06:31答え合わせ
それでは、解答です。 正解は4番目の「12 3 3 1」です! まず、今回の出題では、敢えて "1" + "2" の答えを全て 12 にして、「プラス演算子でも「&」のように文字列の連結がされるんだよ」とアピールさせてもらいました。 その上で「じゃあ数値と文字列の場合はどうなるの?」を問いました。 pic.twitter.com/e7LFgoxuaI
2020-01-24 23:55:58> "1" + 2 と > 1 + "2" は、普通、以下の3パターンが考えられますが ・エラーになる ・左辺の型に合わせる ・両辺の幅広い表現に対応できる型に合わせる VBAは ・(何故か)数値に揃えて加算する という動きをするようです。
2020-01-25 00:11:52また、 > "a"+1 や > 1+"a" は、「型が一致しません。」というエラーになります。 両辺が文字列の場合のみ「+」演算子は「&」演算子の代替として機能するような感じです。
2020-01-25 00:17:58従って、「+」演算子が登場したときは、両辺の値を数値型に暗黙的にキャストが行われてから、計算が行われる仕様なのだろうと私は推測しました。 もっと詳しい検証は、ほえほえさんがしてくれました。 twitter.com/hoehoe1234/sta…
2020-01-25 00:20:23すんません。外出するんで、ちゅんさんの問題のワイなりの推測をおいていきます。エラーケースはいれていませんが1 + "A"などは実行時エラーとなります。一旦CDblで変換して演算されると覚えると覚えやすいかもですね。(双方文字列型かつ+演算子は特例ですね。この特例は良くないかもですw)。 pic.twitter.com/Y2ox52i7E5
2020-01-24 15:14:59