Objective-C中的指令算法

Mik*_*ynn 0 objective-c c-preprocessor

我的问题基于Objective-C指令,并减去它们.以下是我的指示.

#define IS_IPAD FALSE
#define RECT_WIDTH IS_IPAD ? 725 : 280
#define RECT_PADDING IS_IPAD ? 50 : 10
Run Code Online (Sandbox Code Playgroud)

如果我NSLog("@%d", RECT_WIDTH - RECT_PADDING),那么我得到50而不是230.为什么会发生这种情况?我可以让它工作的唯一方法是将每个分配给一个int,然后减去这两个.

zne*_*eak 6

这是因为操作的优先级.您的代码扩展为:

NSLog(@"%d", FALSE ? 725 : 280 - FALSE ? 50 : 10);
Run Code Online (Sandbox Code Playgroud)

对于C的运算符优先级规则,一旦"括号",就会得到:

NSLog(@"%d", FALSE ? 725 : ((280 - FALSE) ? 50 : 10));
Run Code Online (Sandbox Code Playgroud)

这是宏的常见问题.它们几乎作为复制粘贴操作扩展,所以如果你不小心,你最终可能会遇到操作员优先级问题(就像你现在拥有的那样).

你有两种可能性.要么为您的定义添加括号,这样就不会发生这种情况:

#define RECT_WIDTH (IS_IPAD ? 725 : 280)
#define RECT_PADDING (IS_IPAD ? 50 : 10)
Run Code Online (Sandbox Code Playgroud)

或者,由于这是在编译时确定的,因此您可以使用#if指令:

#if IS_IPAD == FALSE
 #define RECT_WIDTH 280
 #define RECT_PADDING 10
#else
 #define RECT_WIDTH 725
 #define RECT_WIDTH 50
#endif
Run Code Online (Sandbox Code Playgroud)