#define max(a,b) \
({ typeof (a) _a = (a); \
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
为什么不简单(a>b ? a : b)?
xan*_*tos 19
因为其他人max(f(1), f(2))会两次调用这两个函数中的一个:
f(1) > f(2) ? f(1) : f(2)
Run Code Online (Sandbox Code Playgroud)
相反,通过"缓存"两个值_a,_b你有
({
sometype _a = (a);
sometype _b = (b);
_a > _b ? _a : _b;
})
Run Code Online (Sandbox Code Playgroud)
(显然正如其他人所指出的那样,自动增量/自动减量存在同样的问题)
我认为Visual Studio不支持这种方式.这是一个复合语句.在这里阅读msvc有gcc的模拟({})
我将在这里给出的gcc手册中添加复合语句的定义http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_4.html#SEC62显示的代码非常类似于其中一个问题最多:-)
它正在绕过诸如此类的主要问题
#define max(a,b) ((a) > (b) ? a : b)
Run Code Online (Sandbox Code Playgroud)
当你用它来调用它时:
int x = max (a++, b--);
Run Code Online (Sandbox Code Playgroud)
由于它是简单的文本替换,因此导致:
int x = ((a++) > (b--) ? a++ : b--);
Run Code Online (Sandbox Code Playgroud)
这不是你想要的.
通过使用:
#define max(a,b) ({
typeof (a) _a = (a);\
typeof (b) _b = (b); \
_a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
它使用临时变量,有效地为您提供:
int x = ({ int _a = a++; int _b = b--; _a > _b ? _a : _b; })
Run Code Online (Sandbox Code Playgroud)
只运行一次副作用.
但是,说实话,你应该完全抛弃那个宏并使用一个inline函数,甚至是一个非内联函数,因为大多数时候,即使没有这个建议,编译器也可以做一个不错的优化工作.