在C ++中计算最大数量的宏会产生不正确的结果

时间:2014-06-06 11:13:50

标签: c++ visual-studio-2013

变量c被指定为负数。我无法理解为什么这个代码产生不正确的结果,因为宏参数周围有括号。这是一个错误还是一个新功能?使用vs2013。

#define max(a,b)            (((a) > (b)) ? (a) : (b))

char *buf = "";

int c = max(1024, strlen(buf) - 1);

3 个答案:

答案 0 :(得分:2)

std::strlen将其值作为std::size_t返回,这是一种实现定义的无符号类型。

要减去strlen(buf)std::size_t)和1int),需要将它们转换为通用类型。如果发生这种情况depends on the rank of the two types,但显然在您的系统上,最终都转换为unsigned int

unsigned int算术中,0 - 1MAX_UINT

max(1024, MAX_UINT)正确评估为MAX_UINT

然后将其隐式转换回int,成为值-1

答案 1 :(得分:1)

使用(signed)strlen(buf)-1,它将产生预期结果。

作为旁注,max(1024, strlen(buf)-1)会生成两次调用函数strlen,因此您可能希望将strlen(buf)-1的结果存储在 signed >传递给max宏之前的变量。

答案 2 :(得分:0)

这里的问题是strlen返回一个unsigned的size_t。从strlen("") == 0开始,0 - 1回绕到0xFFFFFFFF,这比1024大得多。当c转换为signed int时,结果为-1。试试int c = max(1024, (int)strlen(buf) - 1);