首页 / 知识
关于c ++:cout可以以某种方式更改变量吗?
2023-04-14 12:37:00

Can cout alter variables somehow?所以我有一个看起来像这样的函数:
在某个时候,此函数溢出并返回一个很大的负值。 为了尝试精确地查明发生的地方,我添加了一个cout语句,使函数如下所示:
而且有效! 当然,我通过使用double彻底解决了这个问题。 但是我很好奇为什么在我编写函数时该函数可以正常工作。 这是典型的,还是我想念的其他地方有错误? (如果有帮助,存储在浮点数中的值只是一个整数值,而不是一个特别大的值。我只是将其放在浮点数中以避免转换。) 欢迎来到浮点奇妙的世界。得到的答案可能取决于编译代码所使用的浮点模型。 发生这种情况是由于IEEE规范和运行代码的硬件之间的差异。您的CPU可能有80位浮点寄存器,可用于保存32位浮点值。这意味着,将值保留在寄存器中时,其精度要比被强制到存储器地址(也称为"归巢"寄存器)的精度高得多。 当您将值传递给cout时,编译器不得不将浮点数写入内存,这会导致精度损失和令人感兴趣的WRT溢出情况。 请参阅有关VC ++浮点开关的MSDN文档。您可以尝试使用/ fp:strict进行编译,看看会发生什么。 将值打印到cout根本不应该改变参数的值。 但是,我已经看到了类似的行为,添加调试语句会导致值更改。在这些情况下,也许我也猜到这是其他语句导致编译器的优化器行为不同,因此为您的函数生成不同的代码。 添加cout语句意味着直接使用x的值。没有它,优化器可能会删除该变量,因此更改了计算顺序,因此更改了答案。
顺便说一句,使用
除其他事项外,这将防止您无意间将变量传递给可能通过非 cout导致对该变量的引用,这通常会导致编译器迫使其将其溢出到堆栈中。 因为它是浮点型的,所以这很可能导致其值从通常具有的double或long double表示形式中被截断。 调用任何需要对x进行指针或引用的函数(非内联函数)都将导致相同的行为,但是如果编译器以后变得更聪明并学会内联它,您将同样被搞砸了:) 我认为cout对变量没有任何影响,问题可能必须在其他地方。 |
最新内容
相关内容
调用函数命令linux?
调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎么调用system函数,使用Android的linux命令1、int system(const chlinux命令更改时区?
linux命令更改时区?,时间,系统,标准,大陆,国家,命令,时区,终端,之后,指令,linux更改时区和时间的命令目录方法1:使用命令行打开终端应用程序。linux命令更改为中文?
linux命令更改为中文?,系统,单位,地方,软件,管理,标准,工具,信息,设备,中文,mv什么意思呢?1、MV的意思具体如下:mV是一个较小的电压单位,可以用linux命令更改域名?
linux命令更改域名?,地址,网站,系统,名称,服务,软件,环境,网址,信息,实时,Linux下ssh主机设置服务器域名解析问题需要在外围设备上做服务器的linux变量是一个命令?
linux变量是一个命令?,系统,信息,变量,名称,官网,地址,环境,代码,地方,命令,$在linux里什么意思所谓$:也就是咱们平常说的“命令提示符”也就是linux命令更改端口号?
linux命令更改端口号?,服务,系统,邮箱,通用,软件,第三,位置,端口,文件,编辑,怎么在linux里面修改端口号1、修改Linux远程端口的方法如下:首先,远linux中变量取余命令?
linux中变量取余命令?,地址,工作,系统,数据,信息,命令,分析,目录,控制台,文件,linux系统常用操作命令linux常用命令有pwd命令、cd命令、ls命令linux更改帐号命令?
linux更改帐号命令?,密码,系统,用户,命令,第三,信息,代码,电脑,地址,终端,linux切换用户命令打开系统中的终端命令框。使用whoami命令查看当前linux查询函数命令?
linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Linux下查找一个函数在哪个库文件中1、默认状态下,gcc并不搜索数学库linux更改用户名命令?
linux更改用户名命令?,系统,密码,用户,网上,代码,命令,用户名,主机名,终端,账户,linux下命令怎么修改用户名1、linux怎么修改文件所属用户?我们linux命令行更改ip?
linux命令行更改ip?,地址,系统,代码,密码,信息,网络,命令,终端,方法,下一步,linux如何修改ip1、修改IP地址:要修改IP地址,您可以使用以下命令之linux下更改权限命令?
linux下更改权限命令?,系统,档案,数字,权限,文件,命令,人员,密码,新增,目录,linux改文件权限为可读写(Linux改文件权限)- -R:递归修改目录及其