[要望]演算子の動作の周知No.09410
fzok4234 さん 21/05/28 10:25
 
こんにちは。

さて、演算子の整数オーバーフローについて
https://www.maruo.co.jp/turukame/3/x10435_.html#10452
で軽く触れていますが、活発な論戦(^^)に埋もれて見つけにくくなってきたので、改
めてマクロの
演算子の仕様でヘルプに載っていないことについて述べます。

 1. 整数の四則演算子は、何も対処していないC言語と同様にオーバーフローを引き
起こします。
    対象は、2項演算の「+」、「-」、「*」、「/」、「%」および単項演算の「-」
です。
 2. 論理演算子は、C言語やC#などとは異なり「短絡評価」は行われず、右辺の式は
左辺の結果を
    問わず必ず評価されます。対象は「||」、「&&」です。
 3. 配列のインデックス演算子「[]」は、インデックスが指す要素が存在しない場合は
    デフォルト値(数値は0、文字列は@"")を必ず返します。C#などのメモリ管理が徹
底された
    言語とは異なり、エラーは発生しません。

いずれもマクロヘルプには記載されていない事項であるためマクロ作成者が気付きに
くく、
動作を十分理解していないと思わぬバグにつながる恐れがあります。できればヘルプ
に追記して
もらえれば多くのマクロ作成者への周知につながるのではと思います。ヘルプ修正の
ご検討の方
よろしくお願いします。

検証マクロは以下の通りです。

debuginfo 2 ;
// 整数オーバーフロー。
debuginfo str( 2147483647      + 1      ) + "\U0000000A" ; // -2147483648。
debuginfo str( ( -2147483648 ) - 1      ) + "\U0000000A" ; // 2147483647。
debuginfo str( 1073741824      * 2      ) + "\U0000000A" ; // -2147483648。
debuginfo str( ( -2147483648 ) / ( -1 ) ) + "\U0000000A" ; // -2147483648。
debuginfo str( ( -2147483648 ) % ( -1 ) ) + "\U0000000A" ; // 0。
debuginfo str( - ( -2147483648 )        ) + "\U0000000A" ; // -2147483648。
// 短絡評価しない。
debuginfo str( 1 || message( @"||" )    ) + "\U0000000A" ; // メッセージ表示。
debuginfo str( 0 && message( @"&&" )    ) + "\U0000000A" ; // メッセージ表示。
// 存在しないはずのインデックス。
#numbers[ 0 ] = 4 ;
debuginfo str( #numbers[ 9 ] )            + "\U0000000A" ; // 0。
$strings[ 0 ] = @"foo" ;
debuginfo @"""" + $strings[ 9 ] + @""""   + "\U0000000A" ; // @""。
endmacro ;


[ ]
RE:09410 [要望]演算子の動作の周知No.09412
秀丸担当 さん 21/05/28 16:29
 

いろいろご指摘ありがとうございます。
演算子の短絡評価しないことや、配列だけでなく、代入していない変数が0や""とし
て参照できることもその通りで、マクロヘルプに追記しておきます。
オーバーフローがあるということも書いておきます。

[ ]
RE:09410 [要望]演算子の動作の周知No.09417
こみやんま さん 21/05/28 23:07
 
>> 配列

これ配列というより、数値型をkeyとするハッシュといったほうがいいですね。
「ここまで利用した」みたいなindex_maxみたいな境界を探ることはできないので。

[ ]
RE:09412 [要望]演算子の動作の周知No.09420
fzok4234 さん 21/05/31 13:37
 
v8.98β10 Float x64にてヘルプの追記を確認しました。改善ありがとうございます。


[ ]