首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么要递增一个size_t默认值,给出垃圾值?

为什么要递增一个size_t默认值,给出垃圾值?
EN

Stack Overflow用户
提问于 2022-01-25 17:14:47
回答 2查看 149关注 0票数 -2

为什么要递增一个size_t默认值,给出垃圾值?

代码语言:javascript
运行
复制
#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;
}

对于上面获得输出的代码

代码语言:javascript
运行
复制
Output:

93937114642880
93937114642304
0
0

这是因为size_t不是POD吗?另外,为什么Test wrong;不调用默认构造函数并将字段初始化为默认值?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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成员为零。

票数 4
EN

Stack Overflow用户

发布于 2022-01-25 17:26:15

struct之后读取Test wrong;成员的行为是未定义的。这是因为它们没有初始化。因此,它们持有不定的值。++要求读取正在递增的对象;因此,(wrong.a)++;是到达的第一个未定义语句。形式上,这意味着整个程序的行为是未定义的!

Test right{};确实对成员进行了初始化,其效果是将其设置为零。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70852892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档