文法について
neko 2013/4/30(Tue) 18:08:51|NO.53719
a -1 という記述がエラーにならないのはなぜか教えてください
a 1 は普通にエラーになります
バージョンは 3.31 です
skyblue 2013/4/30(Tue) 18:17:30|NO.53720
>a -1
a引く1 もしくは a足す -1のどちらかなのにたいして
>a 1
こちらは式になっていないため構文エラーになっているはず。
test 2013/4/30(Tue) 18:28:45|NO.53721
ちなみにHSPにおいてはなぜか、a-1
はa-=1
と同じ意味になります。同様にa+1
もa+=1
と同じ意味になります。
他にa-
はa--
と同じ、a+
はa++
と同じです。
これらはHSP特有のよくわからない文法です。
neko 2013/4/30(Tue) 19:34:32|NO.53724
なるほど代入式になってるんですね
ちなみにこれ、自作の set_char_space という文字間隔を指定する命令で
誤って set_charspace -2 と書いたのがエラーにならなかったことで発覚したのですが
大問題じゃないですか?
同時に #cmpopt varinit 1 も指定していたのですが、こちらはこちらで
代入先の変数名を誤ると検出対象にならないし(代入ですからね)
ともかく理由が分かって助かりました。
お二人ともありがとうございました。
YSR 2013/5/1(Wed) 00:09:42|NO.53731
>NO.53721
ベンチしてみたところ、計算速度はa++の方がa+より微妙に速い模様
と言うかCやC++じゃ「++i」といった前置インクリメントの方が普通に速かったりする現実……
test 2013/5/1(Wed) 09:55:56|NO.53733
手元の環境(HSP3.32)で試したところ、a++:906ms
a+:905ms
a+1:1172ms
a+=1:1173ms
となりました。a++とa+, a+1とa+=1に関連性が見られる気がします。#include "d3m.hsp"
#const COUNT 10000000
start=d3timer()
a=0
repeat COUNT
a++
loop
en=d3timer()
mes "a++:"+(en-start)+"ms"
start=d3timer()
a=0
repeat COUNT
a+
loop
en=d3timer()
mes "a+:"+(en-start)+"ms"
start=d3timer()
a=0
repeat COUNT
a+1
loop
en=d3timer()
mes "a+1:"+(en-start)+"ms"
start=d3timer()
a=0
repeat COUNT
a+=1
loop
en=d3timer()
mes "a+=1:"+(en-start)+"ms"
KA 2013/5/1(Wed) 12:18:16|NO.53735
>>エラーにならなかったことで発覚したのですが大問題じゃないですか
中途半端に仕様外の書式を容認しているので、柔軟性と言うよりも曖昧
さが増しています。取りあえず作る側で注意するしかないでしょう。
ZAP 2013/5/1(Wed) 19:34:19|NO.53755
少なくとも
a+1
は制作者側が想定していないけど通っちゃうケースだと思われるので、
今後のバージョンアップによる仕様変更とかを考えると使わないのが無難でしょう。
チェックを厳密にしていないのは速度を稼ぐためなのかな。
hiro 2013/5/1(Wed) 23:29:27|NO.53756
仕様範囲内かと思います。
doclib\history.txt
2009/07/13 3.2b4
「=」を省略した複合代入「v+(1)」の書式を許容するように修正(fujidig)
doclib\hspprog.htm
3.8. 変数
「変数」に「+」または「-」を付加することで+1と-1を実行します。
(また、「=」を省略して 「変数」+「演算子」+「パラメーター」の形式でも 同様の動作になります。
ただし、この書式はC言語やJavaなどとの互換性がないため推奨はされません。)
ZAP 2013/5/1(Wed) 23:42:53|NO.53758
>hiroさん
推奨はしないけど仕様としては作者の想定内だったのですね。
勉強になりました。
しかし速度的にも++や--にくらべて劇的に早くなるわけでもなく、
仕様ならなぜあえて残してあるのかが逆に不思議です。