变量c被指定为负数。我无法理解为什么这个代码产生不正确的结果,因为宏参数周围有括号。这是一个错误还是一个新功能?使用vs2013。
#define max(a,b) (((a) > (b)) ? (a) : (b))
char *buf = "";
int c = max(1024, strlen(buf) - 1);
答案 0 :(得分:2)
std::strlen
将其值作为std::size_t
返回,这是一种实现定义的无符号类型。
要减去strlen(buf)
(std::size_t
)和1
(int
),需要将它们转换为通用类型。如果发生这种情况depends on the rank of the two types,但显然在您的系统上,最终都转换为unsigned int
。
在unsigned int
算术中,0 - 1
为MAX_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);