C++ c++;方法的不同输出取决于代码中的位置
我是一个有以下代码问题的用户。基本上,当我将方法C++ c++;方法的不同输出取决于代码中的位置,c++,C++,我是一个有以下代码问题的用户。基本上,当我将方法size()直接放入表达式中时,会得到意外的输出。当我运行该方法并将其输出分配给一个变量,然后在表达式中使用该变量时,我不再有问题 当我使用调试器运行此代码时 Line * line_cf = music.getLine("cf"); ... some other code ... { int lsiz
size()
直接放入表达式中时,会得到意外的输出。当我运行该方法并将其输出分配给一个变量,然后在表达式中使用该变量时,我不再有问题
当我使用调试器运行此代码时
Line * line_cf = music.getLine("cf");
... some other code ...
{
int lsize = line_cf->size();
double r2 = abs(36-(line_cf->size()));
}
我得到了一个奇怪的r2值
lsize -> 39
r2 -> 1.8446744073709552e+19
如果我改为运行此代码
Line * line_cf = music.getLine("cf");
... some other code ...
{
int lsize = line_cf->size();
double r2 = abs(36-lsize); // <---
}
Line是一个用户定义的类
class Line : std::list<TonalNote> {
public:
std::string id;
MusicStyle style;
};
仍然为
r2
获取相同的奇怪值。因此,我认为这消除了Line::size()
改变自身状态的可能性。我几乎可以肯定Line\u cf->size()
返回类型为size\t
的对象。如果你写信
size_t lsize = line_cf->size();
double r2 = abs(36-lsize);
您将得到相同的大数字
原因是(36 lsize)
将计算为大小类型的值,当lsize
为39
时,将计算为非常大的值
当您将line\u cf->size()
的返回值存储在int
中,并在(36 lsize)
中使用该变量时,您会得到一个有符号整数减法结果,这是一种更合理的方式。我几乎可以肯定line\u cf->size()
返回类型为size\t
的对象。如果你写信
size_t lsize = line_cf->size();
double r2 = abs(36-lsize);
您将得到相同的大数字
原因是(36 lsize)
将计算为大小类型的值,当lsize
为39
时,将计算为非常大的值
当您将line\u cf->size()
的返回值存储在int
中,并在(36 lsize)
中使用该变量时,您会得到一个有符号整数减法结果,它的工作方式更合理。size()
返回一个64位无符号整数,因此减法36-(line\u cf->size())
出现在64位无符号整数类型中,导致算术概括为2^64
例如:
#include <iostream>
#include <cmath>
int main() {
std::cout << static_cast<double>(std::fabs(36 - 39ull));
}
size()
返回的是一个64位无符号整数,因此减法36-(line\cf->size())
发生在64位无符号整数类型中,导致算术概括为2^64
例如:
#include <iostream>
#include <cmath>
int main() {
std::cout << static_cast<double>(std::fabs(36 - 39ull));
}
或者它没有发生。您的代码中可能有一个行为未定义的bug,它可能与您所展示的内容完全无关。使用valgrind可能会给你一个线索。如果你能发布一个。。。首先,行的定义应该是类行:public std::list{…}
。。。。否则,世界其他地区将无法访问列表中的size()
方法。。。(除非你有自己的size()
方法……在这种情况下,我们需要查看它)。你能发布Line::size()
的代码吗?我猜调用此方法会更改行
对象的内部状态,因此它会为后续调用返回垃圾。我不会在显示的范围括号内删除任何代码。这正是我正在用gdb调试的代码。我不会在类行中重新实现size()。这只是从std::list继承的函数。在此代码之前或之前,valgrind没有发生任何错误。valgrind的第一个错误出现在代码的后面。或者它没有发生。您的代码中可能有一个行为未定义的bug,它可能与您所展示的内容完全无关。使用valgrind可能会给你一个线索。如果你能发布一个。。。首先,行的定义应该是类行:public std::list{…}
。。。。否则,世界其他地区将无法访问列表中的size()
方法。。。(除非你有自己的size()
方法……在这种情况下,我们需要查看它)。你能发布Line::size()
的代码吗?我猜调用此方法会更改行
对象的内部状态,因此它会为后续调用返回垃圾。我不会在显示的范围括号内删除任何代码。这正是我正在用gdb调试的代码。我不会在类行中重新实现size()。这只是从std::list继承的函数。在此代码之前或之前,valgrind没有发生任何错误。valgrind的第一个错误出现在代码的后面,我认为这是正确的。当我将line\u cf->size()
转换为int时,我得到了正确的结果。谢谢,我想这是对的。当我将line\u cf->size()
转换为int时,我得到了正确的结果。非常感谢。
double r2 = abs(36-static_cast<int>(line_cf->size()));
^^^^^^^^^^^^^^^^