C++11 中 std::to_string 的奇怪输出
Strange outputs of std::to_string in C++11
我有一小段 C++ 代码:
#include <array>
#include <string>
#include <iostream>
int main()
{
std::string name = "mario";
std::cerr << "Hello world! " + name + "\n";
std::array<float, 4> arr = {12, 12.3, 13, 14};
std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
return 0;
}
编译输出如下:
work ❯ c++ -std=c++11 -o hello_world hello.cpp
work ❯ ./hello_world
Hello world! mario
first item is: 12.000000
last item is: 0.000000
但是,如果我注释掉前两行,例如:
#include <array>
#include <string>
#include <iostream>
int main()
{
//std::string name = "mario";
//std::cerr << "Hello world! " + name + "\n";
std::array<float, 4> arr = {12, 12.3, 13, 14};
std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
return 0;
}
并编译 运行 它。然后输出如下:
work ❯ c++ -std=c++11 -o hello_world hello.cpp
work ❯ ./hello_world
first item is: 12.000000
last item is: 12.000000
我有三个问题:
- 为什么我们在第一种情况下使用
arr[-1]
时得到 0.000?
- 为什么我们在第二种情况下使用
arr[-1]
得到 12.000?
- 为什么在第二种情况下,当我们注释掉前两个语句时,
arr[-1]
得到不同的输出?
编辑:根据评论,我知道 arr[-1]
将是未定义的行为,因此在第一种情况下 returns 0.000。但是,注释掉其他语句如何改变这种行为?这让我完全困惑,因为我来自 Python 世界。
这是因为 Undefined behavior, as std::array::operator[]
不执行任何边界检查,而您正在访问不存在的内容。
std::array::operator[]
Returns a reference to the element at
specified location pos. No bounds checking is performed.
因此,无论您更改或评论什么,UB 仍将是 UB。
我有一小段 C++ 代码:
#include <array>
#include <string>
#include <iostream>
int main()
{
std::string name = "mario";
std::cerr << "Hello world! " + name + "\n";
std::array<float, 4> arr = {12, 12.3, 13, 14};
std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
return 0;
}
编译输出如下:
work ❯ c++ -std=c++11 -o hello_world hello.cpp
work ❯ ./hello_world
Hello world! mario
first item is: 12.000000
last item is: 0.000000
但是,如果我注释掉前两行,例如:
#include <array>
#include <string>
#include <iostream>
int main()
{
//std::string name = "mario";
//std::cerr << "Hello world! " + name + "\n";
std::array<float, 4> arr = {12, 12.3, 13, 14};
std::cerr << "first item is: " + std::to_string(arr.front()) << std::endl;
std::cerr << "last item is: " + std::to_string(arr[-1]) << std::endl;
return 0;
}
并编译 运行 它。然后输出如下:
work ❯ c++ -std=c++11 -o hello_world hello.cpp
work ❯ ./hello_world
first item is: 12.000000
last item is: 12.000000
我有三个问题:
- 为什么我们在第一种情况下使用
arr[-1]
时得到 0.000? - 为什么我们在第二种情况下使用
arr[-1]
得到 12.000? - 为什么在第二种情况下,当我们注释掉前两个语句时,
arr[-1]
得到不同的输出?
编辑:根据评论,我知道 arr[-1]
将是未定义的行为,因此在第一种情况下 returns 0.000。但是,注释掉其他语句如何改变这种行为?这让我完全困惑,因为我来自 Python 世界。
这是因为 Undefined behavior, as std::array::operator[]
不执行任何边界检查,而您正在访问不存在的内容。
std::array::operator[]
Returns a reference to the element at specified location pos. No bounds checking is performed.
因此,无论您更改或评论什么,UB 仍将是 UB。