用于计算 C++ 中最大数量的宏会产生不正确的结果
Macro to calculate maximum number in C++ produces incorrect results
变量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 - 1
是MAX_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);
相关文章:
- 密码登录程序将永远循环并显示不正确的结果
- 特征 LLT 模块给出不正确的结果?
- 计算幂级数的数学结果不正确
- wcslen() 在使用编译指示包时返回不正确的结果
- 使用动态分配的数组进行矩阵乘法;结果不正确
- CMake 查找特征不正确的结果
- 将函数的地址转换为UINTPTR_T给我不正确的结果
- 使用 C++ 中的运算符重载显示不正确的结果
- 简单的程序比较阵列运行但给出不正确的结果
- 在运行libtorch的模型时获得的结果是不正确的,该模型经过训练并从Pytorch出口
- 当我输入分数值时,它返回不正确的结果
- time_t提高日期转换,给出不正确的结果
- 为什么隐式类型转换在此代码中结果不正确
- 排序向量不断修改数据并打印不正确的结果
- 使用Boost Polygon的减法结果不正确
- 脑解释器在C++产生不正确的结果
- 具有OFN_ALLOWMULTISELECT不正确的快捷方式结果的 CFileDialog
- 递归阶乘函数在"22!"上产生不正确的结果
- GLM 矩阵乘法向量给出不正确的结果
- 浮点数和由于舍入行为导致的不正确结果