为什么要递增一个size_t默认值,给出垃圾值?
#include <iostream>
using namespace std;
struct Test {
size_t a;
size_t b;
};
int main() {
Test wrong;
cout << (wrong.a) ++;
cout << endl;
cout << (wrong.b) ++;
cout << endl;
Test right {};
cout << (right.a) ++;
cout << endl;
cout << (right.b) ++;
return 0;
}对于上面获得输出的代码
Output:
93937114642880
93937114642304
0
0这是因为size_t不是POD吗?另外,为什么Test wrong;不调用默认构造函数并将字段初始化为默认值?
发布于 2022-01-25 17:33:58
为什么要递增一个
size_t默认值,给出垃圾值?
你需要非常小心你的术语。default在C++中有着特殊的意义。
在第一种情况下,size_t变量在wrong中没有被赋予默认值。您正在递增具有不确定值的未初始化变量。这是未定义的行为。因此,您将得到垃圾输出,因为您首先要对垃圾值进行操作。
在第二个例子中,您是在将size_t变量在right中初始化为0,然后增量它们,即定义良好的行为。由于您使用的是增量后++运算符,它在增量之前返回前一个值,这就是为什么输出是0而不是1的原因。
,这是因为
size_t不是POD吗?
不是的。size_t是一种POD型。
还为什么
Test wrong;不调用默认构造函数并将字段初始化为默认值?
Test wrong;执行。它确实调用了默认构造函数,但您只是没有自己实现该构造函数,所以编译器自动为您生成一个构造函数。因为所有的成员都是荚,所以生成的构造函数没有什么可做的,所以它根本不初始化成员。
Test right{};执行,在本例中,这将使size_t成员为零。
发布于 2022-01-25 17:26:15
在struct之后读取Test wrong;成员的行为是未定义的。这是因为它们没有初始化。因此,它们持有不定的值。++要求读取正在递增的对象;因此,(wrong.a)++;是到达的第一个未定义语句。形式上,这意味着整个程序的行为是未定义的!
Test right{};确实对成员进行了初始化,其效果是将其设置为零。
https://stackoverflow.com/questions/70852892
复制相似问题