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

未初始化变量与类型安全性的关系
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

复制
相关文章
【错误记录】Melodyne 报错 ( 无法打开音频文件 )
打开一个 48000Hz , 立体声音源 , 采样位数 32 位的采样 , 无法打开 , 报下面的错误 ;
韩曙亮
2023/03/29
9410
【错误记录】Melodyne 报错 ( 无法打开音频文件 )
office xls 文件已损坏 无法打开 word在试图打开文件时遇到错误
转自:http://windyli.blog.51cto.com/1300305/326491
全栈程序员站长
2022/09/01
2.7K0
【错误记录】无法打开 “xxx“ , 因为 Apple 无法检查其是否包含恶意软件
选择 " 通用 " 选项卡 , 在下面找到被拦截的软件 , 选择 " 仍要打开 " ;
韩曙亮
2023/03/29
1.2K0
【错误记录】无法打开 “xxx“ , 因为 Apple 无法检查其是否包含恶意软件
VS无法打开源文件及无法打开链接库文件的解决方法
依次点击“项目——配置属性——C/C++——常规”,在“附加包含目录”中加入.h文件所在的文件夹路径
全栈程序员站长
2022/09/08
6.6K0
VS无法打开源文件及无法打开链接库文件的解决方法
错误代码502,网页无法打开?教你如何解决!
在使用互联网的过程中,我们时常会遇到各种错误代码,其中502错误代码是最为常见的一种。502 Bad Gateway错误表示,网关或代理服务无法将请求发送到上游服务器。那么,错误代码502是什么意思?
德迅云安全--陈琦琦
2023/10/08
10.4K0
腾讯云香港服务器无法打开宝塔面板
toc 问题描述:腾讯云香港服务器无法打开宝塔面板 今天想试试香港服务器,看了下价格,心在滴血。。。 [在这里插入图片描述] 和国内的比也太贵了, 最后打算买一个月的试试水 [在这里插入图片描述] 安装了一下宝塔插件,finalshell可以正常连接服务器 [在这里插入图片描述] 测试一下连接百度 [在这里插入图片描述] 可是宝塔面板就是进不去 [在这里插入图片描述] 解决方法 登录服务器控制台,打开安全组 [在这里插入图片描述] 点击修改规则 [在这里插入图片描述] 在协议端口添加 ==,8888=
炒香菇的书呆子
2021/05/17
45.4K0
腾讯云香港服务器无法打开宝塔面板
SaveFileDialog无法打开
当前画面是报表画面,没用线程。主画面点击按钮,打开该画面,是在子线程中打开的,所以SaveFileDialog也无法直接打开
全栈程序员站长
2022/11/10
2K0
matlab中importdata无法打开文件_importdata无法打开文件
最近使用importdata函数不能读取全部数据,数据集315行,但是读取了197行,那就是197-198之间有问题,百度之后有了思路。由于没有找到具体的证据,所以这里说一下解决思路。
全栈程序员站长
2022/11/16
6.5K0
matlab中importdata无法打开文件_importdata无法打开文件
解决xampp无法打开数据库的问题
因为以前安装过mysql所以需要更改注册表路径 首先在c盘的C:\Windows路径下找到注册表编辑器,打开
天天Lotay
2022/12/02
1.6K0
解决xampp无法打开数据库的问题
错误 RC1015: 无法打开包含文件 'XTToolkitPro.rc'
XtremeToolkitPro作为VC++/MFC平台下目前最流行的GUI界面库之一,安装和使用都很方便。不过,在实际使用中还是碰到许多问题。如果在编译工程时只显示一个错误:RC1015: 无法打开包含文件 'XTToolkitPro.rc',这时可能是因为资源路径问题导致。解决方法有两种:
步行者08
2018/10/09
2.4K0
word输入矩阵卡死,导致word在试图打开文件时遇到错误
问题: 今天用office word 2019输入一个矩阵的时候,突然卡死了。强制关闭了word。再打开就变成这样了。
全栈程序员站长
2022/08/31
1.2K0
香港服务器无法打开宝塔面板解决方法
@toc 问题描述:腾讯云香港服务器无法打开宝塔面板 今天想试试香港服务器,看了下价格,心在滴血。。。 [在这里插入图片描述] 和国内的比也太贵了, 最后打算买一个月的试试水 [在这里插入图片描述] 安装了一下宝塔插件,finalshell可以正常连接服务器 [在这里插入图片描述] 测试一下连接百度 [在这里插入图片描述] 可是宝塔面板就是进不去 [在这里插入图片描述] 解决方法 登录服务器控制台,打开安全组 [在这里插入图片描述] 点击修改规则 [在这里插入图片描述] 在协议端口添加 ==,8888
炒香菇的书呆子
2021/05/28
4.8K0
电脑无法打开github
配置了一台新电脑,输入github地址 一直在加载无法打开,确认了不是自己的网络差 解决办法:
河湾欢儿
2020/03/20
4.3K0
无法从/var/lib/rpm打开软件包数据库
centos使用rpm命令安装epel*遇到问题 安装epel*报错 错误:rpmdb: BDB0113 Thread/process 27383/140189131929664 failed: BDB1507 Thread died in Berkeley DB library 错误:db5 错误(-30973) 来自 dbenv->failchk:BDB0087 DB_RUNRECOVERY: Fatal error, run database recovery 错误:无法使用 db5 - (-30
薛定喵君
2019/11/06
3.7K0
网站数据库无法打开 phpMyAdmin启用失败 解决
最近突然网站后台的数据库无法打开,尝试 各种方法,更换PHP版本,卸载、重装phpAdmin都无济于事,最后发现是安全组问题。
梦溪
2021/08/09
2.2K0
Linux服务器数据恢复-服务器修复无法启动错误过程
介绍数据恢复案例前照例先介绍故障服务器的物理状况。本次数据恢复的服务器是linux操作系统,某品牌730系列服务器,MD3200系列存储。导致数据丢失的原因是机房意外断电导致系统无法正常启动,客户管理员对无法访问的服务器进行了修复操作后进入系统查看数据,服务器部分文件已经丢失。于是客户管理员联系了数据恢复中心进行服务器数据恢复。
北亚数据恢复中心
2020/01/13
3.8K0
Linux服务器数据恢复-服务器修复无法启动错误过程
Safari 浏览器无法打开页面 错误是:“cannot parse response" (NSURLErrorDomain: -1017)
nginx 做反向代理,后端web apache服务应用(古老的网站了,也不想动了),有一个web不加www访问的web站点,chrom浏览器正常访问,但是safari浏览器不能正常打开并出现一下错误:
对你无可奈何
2023/06/28
5590
错误: 找不到或无法加载主类(java)
很多刚学java的同学基本上都遇到过这个问题,刚才我刚了一下idea中入口雷类的包的地址,就出现这个了。原因很简单,在此特做记录,希望能帮助到点开这个文章,遇到错误的你。
手撕代码八百里
2020/07/28
5.2K0
IReport无法打开的原因
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说IReport无法打开的原因,希望能够帮助大家进步!!!
Java架构师必看
2021/11/30
2.3K0
IReport无法打开的原因
点击加载更多

相似问题

SQLite java错误“无法打开数据库文件”

10

数据库无法打开,错误: java.lang.NullPointerExecption

13

CMake错误-无法打开输入文件?

10

Lipo错误:无法打开输入文件

40

“无法打开输入文件”crons错误

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档