#include <stdio.h>
#define ABS(a) (a) < 0 ? -(a) : (a)
int main(void)
{
printf("%d\n", ABS(-3) + 1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码片段来自赫伯特·希尔特(Herbert Schildt)的书,看起来它会产生输出4但实际上是打印出来的3.为什么?
我如何解决它?
正确的方法是使用一个inline函数,_Generic为每个类型支持一个大小写.否则你会评估a两次.
代替它,您可以通过在宏中括起表达式来修复它.这一直是防止这类问题的好主意.
#define ABS(a) ((a) < 0 ? -(a) : (a))
Run Code Online (Sandbox Code Playgroud)
问题来自因为X ? Y : Z + 1手段X ? Y : (Z + 1).