HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0515
HocK#defineの展開順序ミス?3解決


HocK

リンク

2006/5/15(Mon) 16:27:30|NO.737

はじめましてHocKと申します。前から気になっていたのですが、

#define ctype Func(%1) (%1*2)
mes ""+(Func(10-5))

↑のを実行すると、0が表示されます。通常ならFuncの引数内を計算してから
その解を引数として渡すべきではないでしょうか?なぜかこのように"-5"のみ
がFuncの引数に渡されて*2され、結果として0になってしまいます。
使用しているバージョンはHSP 3.1b3です。長文すみません。



この記事に返信する


Irisawa

リンク

2006/5/15(Mon) 16:59:58|NO.738

#defineはマクロであり、関数ではありません。
その点を注意してください。(ヘルプにも同様の注意書きがあります)


#define ctype Func(%1) (%1 * 2) mes "" + (Func(10 - 5)) stop

これをプリプロセッサが処理すると


mes@hsp "" + ((10 - 5 * 2) ) stop@hsp

となります。
優先順位からして「5 * 2」の方が優先順位が高いため、こうなります。
Funcの引数を定数として渡したい場合は、関数にするか


#define ctype Func(%1) ((%1) * 2)

のように優先順位を指定してください。



Irisawa

リンク

2006/5/15(Mon) 17:03:43|NO.739

> 優先順位からして「5 * 2」の方が優先順位が高いため、こうなります。

10 - 5 * 2 = 10 - (5 * 2) = 10 - (10) = 10 - 10 = 0

です。



HocK

リンク

2006/5/15(Mon) 17:57:15|NO.742

Irisawaさん返信ありがとうございます。#define ctypeの実装がよくわかりました。
以後気をつけます。



ONION software Copyright 1997-2018(c) All rights reserved.