变量的初始化与使用C语言程序注释,c - (为什么)使用未初始化的变量未定义行为?...

C标准为编译器提供了很大的优势来执行优化。 如果您假设一个简单的程序模型,其中未初始化的内存被设置为某个随机位模式,并且所有操作都按照它们的写入顺序执行,那么这些优化的后果可能会令人惊讶。

注意:以下示例仅有效,因为x从未使用其地址,因此它是“类似寄存器”。 如果x = - x的类型具有陷阱表示,它们也将有效; 这对于无符号类型来说很少见(它需要“浪费”至少一位存储空间,并且必须记录在案),而-x则不可能。如果x有签名类型,那么实现可以定义不是 - (2n-1-1)和2n-1-1之间的数字作为陷阱表示。 见Jens Gustedt的回答。

编译器尝试将寄存器分配给变量,因为寄存器比内存快。 由于程序可能使用比处理器具有寄存器更多的变量,因此编译器执行寄存器分配,这导致在不同时间使用相同寄存器的不同变量。 考虑程序片段

unsigned x, y, z; /* 0 */

y = 0; /* 1 */

z = 4; /* 2 */

x = - x; /* 3 */

y = y + z; /* 4 */

x = y + 1; /* 5 */

当评估第3行时,x = - x尚未初始化,因此(编译器的原因)第3行必须是由于编译器不够聪明的其他条件而不能发生的某种侥幸。 由于在第4行之后未使用-x,并且在第5行之前未使用x,因此可以对两个变量使用相同的寄存器。 所以这个小程序编译成寄存器上的以下操作:

r1 = 0;

r0 = 4;

r0 = - r0;

r1 += r0;

r0 = r1;

最终值x = - x是最终值-x,最终值x是最终值x.这些值是x = -3和y = -4,而不是5和4,如果x = some_value()已经发生 正确初始化。

有关更详细的示例,请考虑以下代码片段:

unsigned i, x;

for (i = 0; i < 10; i++) {

x = (condition() ? some_value() : -x);

}

假设编译器检测到x = - x没有副作用。 由于-x不修改x,编译器知道第一次循环运行不可能访问x,因为它尚未初始化。 因此,循环体的第一次执行相当于x = some_value(),无需测试条件。 编译器可以编译此代码,就像您编写的那样

unsigned i, x;

i = 0; /* if some_value() uses i */

x = some_value();

for (i = 1; i < 10; i++) {

x = (condition() ? some_value() : -x);

}

这可以在编译器内建模的方式是考虑依赖于x = - x的任何值都具有方便的值,只要-x未初始化即可。 因为未初始化变量未定义时的行为,而不是仅具有未指定值的变量,编译器不需要跟踪任何方便值之间的任何特殊数学关系。 因此编译器可以用这种方式分析上面的代码:

在第一次循环迭代期间,x = - x在评估-x时未初始化。

x = - x具有未定义的行为,因此它的值是任何方便的。

优化规则? 价值:价值适用,所以这段代码可以简化为; 值。

当遇到问题中的代码时,同一个编译器会分析当评估x = - x时,-x的值是方便的。 因此,可以优化分配。

我没有找到一个行为如上所述的编译器的例子,但它是优秀的编译器试图做的优化。 遇到一个我不会感到惊讶。 这是程序崩溃的编译器的一个不太合理的例子。 (如果在某种高级调试模式下编译程序,可能不会令人难以置信。)

这个假设的编译器将每个变量映射到不同的内存页面并设置页面属性,以便从未初始化的变量读取会导致调用调试器的处理器陷阱。 首先对变量赋值,确保其内存页面正常映射。 此编译器不会尝试执行任何高级优化 - 它处于调试模式,旨在轻松定位诸如未初始化变量之类的错误。 当评估x = - x时,右侧会导致陷阱并且调试器将启动。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三羊献瑞c语言编程入门,蓝桥杯-三羊献瑞,

蓝桥杯-三羊献瑞&#xff0c;更多精彩文章请关注公众号『大海的BLOG』问题观察下面的加法算式&#xff1a;祥 瑞 生 辉 三 羊 献 瑞----------------三 羊 生 瑞 气其中&#xff0c;相同的汉字代表相同的数字&#xff0c;不同的汉字代表不同的数字&#xff0c;‘三’和‘祥’不…

Struts2.3接收post方式提交的表单参数的方式

一&#xff1a;方式一&#xff1a;通过request来获取&#xff0c;首先让action实现ServletRequestAware接口&#xff0c;然后通过request来获取提交的参数&#xff0c;代码如下: package cn.gov.csrc.flight.action;import java.util.HashMap; import java.util.List; import j…

倒果汁c语言,水果榨汁补维生素C?这些补维生素的错误别再犯了

原标题&#xff1a;水果榨汁补维生素C&#xff1f;这些补维生素的错误别再犯了蔬菜和水果作为维生素C、矿物质和植物纤维的重要来源&#xff0c;是每天餐桌上都要出现的食物&#xff0c;一旦水果蔬菜吃不够&#xff0c;身体就会开始找你麻烦。在处理蔬菜水果的时候&#xff0c;…

dos和linux有关系吗,DOS和Linux近年来的发展比较

大家都听说过Linux操作系统吧&#xff01;Linux诞生于20世纪的90年代初&#xff0c;于90年代末开始出名并在许多人中开始了实际使用。著名的“开放源代码”运动更是使新的Linux程序不断出现&#xff0c;使Linux得到了进一步的发展&#xff0c;尤其是在服务器领域得到了较大的应…

c语言中二维数组的结构体,怎么才能把结构体里面的二维数组打印出来?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼萌新一位&#xff0c;学到结构体在做作业&#xff0c;遇到了这个问题。求提示出现这样的报错&#xff1a;[Error] cannot convert char (*)[20] to char* for argument 5 to void HeroShow(int, int, char*, char*, char*, char*)#…

android中资源文件的两种访问方式,Android_Android学习笔记-保存文件(Saving Files),Android设备有两种文件存储区域 - phpStudy...

Android学习笔记-保存文件(Saving Files)Android设备有两种文件存储区域:内部存储和外部存储 ("internal" and "external" storage)。这名字来自早期Android&#xff0c;那时大多数Android设备提供两种存储方式:内置的非易失的内存(内部存储)和可移动的存储…

Struts2.3,s:iterator,c:forEach遍历map中的list集合

一&#xff1a;首先是<s:iterator></s:iterator>遍历map中的list集合&#xff0c;代码如下&#xff1a; 1.首先是后台代码&#xff0c;包括定义map和给map中赋值&#xff0c;代码如下&#xff1a; package cn.gov.csrc.cms.action;import java.util.HashMap; impo…

android 判断对象,Android网络判断知识小结

Android中判断当前网络是否可用应用场景&#xff1a;实现判断当前网络是否可用当前有可用网络&#xff0c;如下图&#xff1a;当前没有可用网络&#xff0c;如下图&#xff1a;实现步骤&#xff1a;1、获取ConnectivityManager对象Context context activity.getApplicationCon…

android fragment动画,Fragment 的过场动画

Fragment 的过场动画Android,Fragment,动画2018.08.03在 Android 开发中&#xff0c;有些应用对页面的过场动画要求比较高&#xff0c;他们中期望给用户提供一个良好的用户体验。适当的过场动画可以减少用户在页面加载时期等待的焦虑&#xff0c;因为让他们看一个动画&#xff…

android 联系人批量插入,GitHub - Atinerlengs/InsertDemo: android 简单的批量插入通话记录、联系人、短信demo...

[toc]批量插入批量插入通话记录下面是添加通话数据的代码&#xff0c;我们自己去构造Tb_calllogs数据&#xff0c;里面可以添加通话记录数据字段&#xff0c;由于是个简单的demo&#xff0c;所以只加了number、callType、date、callDuration。/*** 添加通话数据** throws Remot…

html页面按钮删除一条数据库,需要添加一个删除按钮到一个HTML表格从数据库中删除记录与消息...

IDNameCodeActiveEdit<?php foreach($nurseries->result() as $nursery) { ?><?php echo $nursery->id; ?><?php echo $nursery->name; ?><?php echo $nursery->code; ?><?php echo set_bool($nursery->active); ?><…

EL表达式, JSTL, 获取map集合中key的value

序言&#xff1a;今天在项目中使用了map存储list和普通对象&#xff0c;但是在jsp中显示的时候出来问题&#xff0c;后经查阅&#xff0c;终于解决&#xff0c;现在记录一下&#xff0c;以便以后查阅&#xff1a; 一&#xff1a;后台代码如下&#xff1a; package cn.gov.csrc…

html选择器是什么,CSS3选择器是什么?

首先我们来看一下displaynone的意思是什么&#xff1f;display:none的意思&#xff1a;隐藏元素并脱离文档&#xff0c;流就是隐藏该区域&#xff0c;不占实际空间&#xff0c;但对后台来说真实存在&#xff0c;可以获取被隐藏的元素简单的来说就是将元素设置为none的时候既不会…

零基础学计算机408,又一所重点大学改考408!21计算机考研会全面408吗?

【北京工业大学】于7月17日发布《关于北京工业大学2021年全国硕士研究生招生考试部分考试科目及考试大纲调整的通知》&#xff0c;要点如下&#xff1a;文法学部0401教育学专业课改考 311统教育学信息学部计算机学院0812计算机科学与技术0839网络空间安全0854电子信息 (专业学位…

国贸专业要考计算机二级,国贸专业考计算机二级有没有必要

类似问题答案我是自动化专业的学生&#xff0c;大一的时候有没有必要考计算机二级证书计算机二级 虽然不是很重要 但是考了也是有好处的 自动化的跟计算机联系非常大 二级证不怎么重要 但是C语言很重要 对于你们 希望你还是去考个二级作为学习建筑类专业的学生,如果考试计算机二…

edge如何导入html文件收藏夹,edge浏览器收藏夹如何导入?edge浏览器收藏夹导入方法...

在使用浏览器的时候需要用户进行多方便的导入和使用&#xff0c;这样在数据共享和传递的时候才会更加的方便&#xff0c;那么这款软件要如何操作使用呢&#xff0c;有兴趣的用户可以使用手机快速申请使用&#xff0c;帮助用户的生活&#xff0c;让用户的生活更加的便捷&#xf…

中职生计算机专业600分,来了!超全盘点高职分类中500-600分及以上的高中生能报的专业和院校名单!...

福建高职分类考试志愿填报4月27日开始&#xff0c;招生计划不断更新中关注【福建高考】&#xff0c;免费使用志愿填报工具参加高职分类的同学们志愿填报在即&#xff0c;你定好目标了吗&#xff1f;本期&#xff0c;小编为大家盘点高职分类各分段的高中生能报哪些专业和大学~一…

Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段类型中存储的xml字符串...

摘要&#xff1a;最近项目中用到了存储过程&#xff0c;触发器&#xff0c;Function&#xff0c;由于以前没怎么用过&#xff0c;所以查资料&#xff0c;请教同事&#xff0c;最后总算是把问题解决了&#xff0c;问题是这样的&#xff0c;数据库中有三张表一张是存放从远程服务…

plc采用计算机结构如何理解,PLC的基本结构

plc实质是一种专用于工业控制的计算机&#xff0c;其硬件结构基本上与微型计算机相同&#xff0e;a. 中央处理单元(CPU)中央处理单元(CPU)是PLC的控制中枢。它按照PLC系统程序赋予的功能接收并存储从编程器键入的用户程序和数据&#xff1b;检查电源、存储器、I/O以及警戒定时器…

华为手机怎么用计算机玩隐藏空间,玩法 | 华为手机这五个隐藏功能,用过的都说好!...

原标题&#xff1a;玩法 | 华为手机这五个隐藏功能&#xff0c;用过的都说好&#xff01;欢迎转载&#xff0c;请注明出处&#xff0c;抄袭必究&#xff01;近年来国产手机都很争气&#xff0c;华为、小米、OPPO、vivo都迅速的成长起来&#xff0c;让大家告别了疯抢苹果的时代。…