|
こんにちは。
さて、演算子の整数オーバーフローについて
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 ;
|
|