宏的用法所以我定義..DEFINE()在expressinions
#define RADIAN(x) x*3.14159265f/180.0f
,然後用它是這樣的:
RADIAN(theta-90)
我的程序不斷地給了我不正確的結果,我花了幾個小時意識到上述聲明與下面的聲明之間存在巨大差異。
RADIAN((theta-90))
現在我的程序運行得很好。爲什麼第一個陳述不正確?
宏的用法所以我定義..DEFINE()在expressinions
#define RADIAN(x) x*3.14159265f/180.0f
,然後用它是這樣的:
RADIAN(theta-90)
我的程序不斷地給了我不正確的結果,我花了幾個小時意識到上述聲明與下面的聲明之間存在巨大差異。
RADIAN((theta-90))
現在我的程序運行得很好。爲什麼第一個陳述不正確?
#define
,使剛剛文本替換,所以RADIAN(theta-90)
真的是theta-90*3.14159265f/180.0f
,什麼obvi不是你的意思。嘗試
#define RADIAN(x) ((x)*3.14159265f/180.0f)
改爲。
或更好的是,'內聯浮動RADIAN(float x){return x * 3.14159265f/180.0f;}'以避免宏的所有缺陷。 – 2011-04-20 07:23:06
+1如果你真的想要使用宏,總是在參數周圍添加括號,就像@ x13n所做的那樣,並且要小心其他缺陷,包括因爲它是* text *替換,表達式可能會被多次賦值:'#定義MAX(x,y)((x)<(y)?(y):(x))'將對'x'或'y'中的一個進行兩次評估,所以MAX(sqrt(100),sqrt(4 ));''會調用'sqrt(100)'兩次,'sqrt(4)'調用一次...使用內聯函數的事情要簡單得多:) – 2011-04-20 07:44:51
宏的largley做的基於文本的替代品,因此
RADIAN(theta-90)
擴展爲:
theta - 90* 3.14159265f/180.0f
這是因爲運算符優先級,計算結果爲:
theta - (90* 3.14159265f/180.0f)
這是因爲,在第一種情況下X將通過(θ-90)來代替讓你的功能將評估爲:上述
theta - 90* 3.14159265f/180.0f
的答案是正確的。然而,還有一點尚未...
這是C++,而不是C.停止使用預處理器宏。
在這種特殊情況下,我不認爲C和C++中,應該用內聯函數替換宏:'inline float radian(float x)',這與C和C++中的方式相同。 – 2011-04-20 07:46:12
操作順序? – 2011-04-20 06:55:16