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

Macro to calculate maximum number in C++ produces incorrect results

本文关键字:不正确 结果 用于 C++ 最大数 计算      更新时间:2023-10-16

变量c被分配为负一。我不明白为什么这段代码会产生不正确的结果,因为宏参数周围有括号。这是一个错误还是一个新功能?使用 vs2013。

#define max(a,b)            (((a) > (b)) ? (a) : (b))
char *buf = "";
int c = max(1024, strlen(buf) - 1);

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

要减去strlen(buf)(std::size_t(和1(int(,它们需要转换为公共类型。 发生这种情况的方式取决于两种类型的等级,但显然在您的系统上,两者都最终转换为 unsigned int .

unsigned int算术中,0 - 1MAX_UINT.

max(1024, MAX_UINT)正确计算为 MAX_UINT

然后它被隐式转换回int,成为-1的值。

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

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

这里的问题是strlen返回一个无符号的size_t。自strlen("") == 0年以来,0 - 1绕到0xFFFFFFFF,比1024大得多。当c转换为有符号的 int 时,结果为 -1。试试int c = max(1024, (int)strlen(buf) - 1);