首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >未初始化变量与类型安全性的关系

未初始化变量与类型安全性的关系
EN

Stack Overflow用户
提问于 2018-06-23 06:16:49
回答 3查看 930关注 0票数 5

我想问为什么使用未初始化的变量被认为是非类型安全的?

我正在阅读Bjarne的初学者书籍(编程原则和使用C++的实践),在这个网站上的C++书籍指南。

书中有一部分是关于类型安全的,它说:

当对象仅根据其类型的规则使用时,程序(或程序的一部分)是类型安全的。例如,在初始化变量之前使用它不被认为是类型安全的.

然后,本书提供了以下代码作为示例:

代码语言:javascript
运行
AI代码解释
复制
 int main() {
        double x; // we "forgot" to initialize
                  // the value of x is undefined

        double y = x; // the value of y is undefined
        double z = 2.0+x; // the meaning of + and the value of z are undefined
 }

我理解没有初始化的局部变量将有一个不确定的值,读取这个变量会导致未定义的行为。我不明白的是它是如何与类型安全联系在一起的。我们仍然从变量的定义中知道类型。

为什么上述代码中的注释指出,当2.0和x都是双倍时,+的含义是未定义的,而+的定义则是double + double?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-23 06:37:16

未定义行为意味着输出可能是您所期望的,或者可能超出了类型的有效范围的某个不确定值。

未定义行为的一个明显示例是https://en.cppreference.com/w/cpp/language/ub#Signed_overflow

代码语言:javascript
运行
AI代码解释
复制
unsigned int i;   // uninitialized
int x = i + 2;    // indeterminate value
if (x + 1 > x) {} // undefined behavior due to signed overflow

如果x的最大值为unsigned int,则i的值可以超出i的有效范围。

因此,对于值不确定的表达式,类型安全性得不到保证。

票数 2
EN

Stack Overflow用户

发布于 2018-06-23 08:03:44

@codekaizer和@Shankar是正确的:根据定义,未定义的行为不是类型安全行为。然而,如何将其应用于原始类型则更难理解。任何适当长的位序列都可能是有效的int,这似乎是合理的。正如@BoPersson在下面指出的,这是不完全正确,实现可以自由地包含导致算术下中断的值。对于整数,这实际上只适用于用于除法时的0,但这并不意味着标准不允许在适当不寻常的体系结构上使用浮点NaN之类的整数版本。

读者可能会发现一个虚拟函数的例子,更直观地说明了为什么未初始化的变量不是类型安全的。考虑:

代码语言:javascript
运行
AI代码解释
复制
struct Base {
    virtual int foo() const =0;
};

struct DerivedA : public Base {
    int foo() const override { return 10; }
};

struct DerivedB : public Base {
    int foo() const override { return -10; }
};

int main() {
    Base* abstractStructPtr;
    std::cout << abstractStructPtr->foo() << std::endl;
    return 0;
}

abstractStructPtr的类型意味着您可以在它上调用foo()。表达式是有效的:abstractStructPtr有一个类型,这就是为什么可以调用foo()。但是,foo()的实现存在于派生类中。

由于abstractStructPtr没有初始化,所以它所指向的数据的结构不能保证它能够完成对foo()的调用。换句话说,虽然absractStructPtr的类型是Base*,但不能保证所指向的数据实际上是任何类型的Base对象。因此,调用foo()是未定义的行为,而不是类型安全。任何事情都可能发生;实际上,它可能只是通过内存访问冲突而崩溃,但它可能不会!卡布卢西。

票数 2
EN

Stack Overflow用户

发布于 2018-06-23 06:25:32

即使“x”被声明为“双”,但由于没有初始化,它在内存中有一个随机位模式,并且该模式可能不代表任何有效的双精度数字。因此,“z的意义”是没有定义的。

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

https://stackoverflow.com/questions/51002033

复制
相关文章
多个checkbox复选框触发点击事件
形如上面这种有list输出到前台的一组复选框,怎么点击其中一个可以触发jquery事件呢?
全栈程序员站长
2022/08/05
1.9K0
python for循环多个参数处理_python for循环嵌套
实际上,“使用for循环遍历数组的最简单方法”(Python类型被命名为“list”BTW)是第二种方法,即for item in somelist:
全栈程序员站长
2022/09/22
2.3K0
python循环(更新中)
---title: python循环tags: 笔记categories: 笔记author: 喵雨date: 2022-06-23 10:56:42coverImg:---while 循环'''循环:whilefor'''# 用while打印1-10之间的数字# 初始值n = 1# 结束条件while n <= 10: print(n) n += 1# 打印1-50之间能被3整除的数字m = 1while m <= 50: if m % 3 == 0: print('---
meowrain
2022/06/23
1K0
python循环(更新中)
Hive一次更新多个分区数据方案
场景 订单数据之类的业务表,因为有状态要更新,比如订单状态,物流状态之类的,需要同步很久之前的数据到Hive. 如何同步时在Hive中进行操作一次更新多个分区内的数据? Hive 操作 设置Hive动
awwewwbbb
2022/09/16
9590
多个单细胞样本数据的循环读取
上一期我们介绍了Seurat对象的构建方法,对于少数样本的数据时,我们可以采取将读取代码复制多遍以运行,如下所示。
小汪Waud
2023/02/16
2.2K0
Python中一个for循环循环多个变量
首先,熟悉一个函数zip,如下是使用help(zip)对zip的解释。 Help on built-in function zip in module __builtin__: zip(...)     zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]     Return a list of tuples, where each tuple contains the i-th element     from each of the argument sequences.  The returned list is truncated
卡尔曼和玻尔兹曼谁曼
2019/01/22
5.1K0
Django批量更新多个属性
有时候我们需要同时(一次性)更新某个用户的多条属性。 1. 用户model如下: class User(models.Model): UID = models.CharField('员工uid', max_length=200,) name = models.CharField('员工名字', max_length=200,) mobile = models.CharField('手机号', max_length=200,) mail = models.EmailField(u'邮箱', max_lengt
BigYoung小站
2020/05/04
2.1K0
使用复选框控制条件格式
我们可以使用条件格式来实现。选择A2:C20,单击功能区“开始”选项卡“样式”组中的“条件格式——新建规则”。在“新建格式规则”对话框中,选择“使用公式确定要设置格式的单元格”,在“为符合此公式的值设置格式”中输入:
fanjy
2022/03/09
2.4K0
使用复选框控制条件格式
for 循环中实现多个点击事件 原
(adsbygoogle = window.adsbygoogle || []).push({});
tianyawhl
2019/04/04
8780
使用VBA给复选框批量命名
如下图1所示,使用列G中单元格的内容给复选框命名,并且当选取复选框中,在列E中相应的单元格显示其状态。
fanjy
2022/03/09
1.7K0
使用VBA给复选框批量命名
django使用多个数据库
通过官方文档https://docs.djangoproject.com/zh-hans/3.1/topics/db/multi-db/和csdnhttps://blog.csdn.net/songfreeman/article/details/70229839的这两篇文章可以进行多数据库的设置。但是设置后可能会出现问题,由于我连接的数据库是通过inspactdb的方法得到的model。于是在migrate的时候出现了问题,会提示 1146, “Table xxx doesn’t exist” 。后来发现问题可能出在路由表上,按照DATABASE_APPS_MAPPING映射之后,django默认的表如果要写入可能会找不到数据库。而源代码里的映射关系并不包含新加入的app,例如grappelli等。
obaby
2023/02/22
4980
Python3中for循环多个变量详解
Python的 for 循环中,使用多个变量可以应用于列表或字典,但它不适用于一般错误。
程序新视界
2023/05/03
1.7K0
【安全更新】微软11月安全更新多个产品高危漏洞
北京时间11月11日,微软发布11月安全更新补丁,修复了112个安全问题,涉及Microsoft Windows、Microsoft Office、Microsoft Exchange Server、Visual Studio、Windows Defender等广泛使用的产品,其中包括远程代码执行和权限提升等高危漏洞类型。
绿盟科技安全情报
2020/11/16
9880
Flutter:使用复选框进行下拉多选
本文向您展示了在 Flutter 中使用复选框实现下拉多选的两种不同方法。在第一种方法中,我们将从头开始构建多选。在第二种方法中,我们将使用第三方包快速完成工作。
徐建国
2022/03/30
3.4K0
Flutter:使用复选框进行下拉多选
Laravel 使用多个数据库连接
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/105853.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/09
1.5K0
django使用多个数据库实现
  在开发 Django 项目的时候,很多时候都是使用一个数据库,即 settings 中只有 default 数据库,但是有一些项目确实也需要使用多个数据库,这样的项目,在数据库配置和使用的时候,就比较麻烦一点。
Se7eN_HOU
2023/04/28
6550
django使用多个数据库实现
【安全更新】微软5月安全更新多个产品高危漏洞通告
5月12日,微软发布5月安全更新补丁,修复了55个安全漏洞,涉及Windows、Microsoft Office、Exchange Server、Visual Studio Code、Internet Explorer等广泛使用的产品,其中包括远程代码执行和权限提升等高危漏洞类型。
绿盟科技安全情报
2021/05/14
1.3K0
【安全更新】微软4月安全更新多个产品高危漏洞通告
4月14日,微软发布4月安全更新补丁,修复了114个安全漏洞,涉及Windows、Office、Edge (Chromium-based) 、Visual Studio Code、Exchange Server、Visual Studio、Azure等广泛使用的产品,其中包括远程代码执行和权限提升等高危漏洞类型。
绿盟科技安全情报
2021/04/26
8430
【安全更新】微软4月安全更新多个产品高危漏洞通告
点击加载更多

相似问题

同步-异步阻塞,非阻塞I/O

15

非阻塞I/O问题

31

阻塞和非阻塞I/O之间的灰色地带?

10

Kotlin:用非阻塞I/O阻塞协同线

21

何时使用非阻塞I/O?

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文