Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;方法的不同输出取决于代码中的位置_C++ - Fatal编程技术网

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()));   
                       ^^^^^^^^^^^^^^^^