关于c ++:cout可以以某种方式更改变量吗?

关于c ++:cout可以以某种方式更改变量吗?

Can cout alter variables somehow?

所以我有一个看起来像这样的函数:

1
2
3
4
float function(){
    float x = SomeValue;
    return x / SomeOtherValue;
}

在某个时候,此函数溢出并返回一个很大的负值。 为了尝试精确地查明发生的地方,我添加了一个cout语句,使函数如下所示:

1
2
3
4
5
float function(){
    float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

而且有效! 当然,我通过使用double彻底解决了这个问题。 但是我很好奇为什么在我编写函数时该函数可以正常工作。 这是典型的,还是我想念的其他地方有错误?

(如果有帮助,存储在浮点数中的值只是一个整数值,而不是一个特别大的值。我只是将其放在浮点数中以避免转换。)


欢迎来到浮点奇妙的世界。得到的答案可能取决于编译代码所使用的浮点模型。

发生这种情况是由于IEEE规范和运行代码的硬件之间的差异。您的CPU可能有80位浮点寄存器,可用于保存32位浮点值。这意味着,将值保留在寄存器中时,其精度要比被强制到存储器地址(也称为"归巢"寄存器)的精度高得多。

当您将值传递给cout时,编译器不得不将浮点数写入内存,这会导致精度损失和令人感兴趣的WRT溢出情况。

请参阅有关VC ++浮点开关的MSDN文档。您可以尝试使用/ fp:strict进行编译,看看会发生什么。


将值打印到cout根本不应该改变参数的值。

但是,我已经看到了类似的行为,添加调试语句会导致值更改。在这些情况下,也许我也猜到这是其他语句导致编译器的优化器行为不同,因此为您的函数生成不同的代码。

添加cout语句意味着直接使用x的值。没有它,优化器可能会删除该变量,因此更改了计算顺序,因此更改了答案。


顺便说一句,使用const声明不可变变量总是一个好主意:

1
2
3
4
5
float function(){
    const float x = SomeValue;
    cout << x;
    return x / SomeOtherValue;
}

除其他事项外,这将防止您无意间将变量传递给可能通过非const引用修改变量的函数。


cout导致对该变量的引用,这通常会导致编译器迫使其将其溢出到堆栈中。

因为它是浮点型的,所以这很可能导致其值从通常具有的double或long double表示形式中被截断。

调用任何需要对x进行指针或引用的函数(非内联函数)都将导致相同的行为,但是如果编译器以后变得更聪明并学会内联它,您将同样被搞砸了:)


我认为cout对变量没有任何影响,问题可能必须在其他地方。


推荐阅读

    调用函数命令linux?

    调用函数命令linux?,系统,管理,网络,通用,统一,观察,地址,代码,设备,地方,怎

    linux命令更改时区?

    linux命令更改时区?,时间,系统,标准,大陆,国家,命令,时区,终端,之后,指令,lin

    linux命令更改为中文?

    linux命令更改为中文?,系统,单位,地方,软件,管理,标准,工具,信息,设备,中文,m

    linux命令更改域名?

    linux命令更改域名?,地址,网站,系统,名称,服务,软件,环境,网址,信息,实时,Lin

    linux变量是一个命令?

    linux变量是一个命令?,系统,信息,变量,名称,官网,地址,环境,代码,地方,命令,$

    linux命令更改端口号?

    linux命令更改端口号?,服务,系统,邮箱,通用,软件,第三,位置,端口,文件,编辑,

    linux中变量取余命令?

    linux中变量取余命令?,地址,工作,系统,数据,信息,命令,分析,目录,控制台,文

    linux更改帐号命令?

    linux更改帐号命令?,密码,系统,用户,命令,第三,信息,代码,电脑,地址,终端,lin

    linux查询函数命令?

    linux查询函数命令?,系统,信息,名称,标准,函数,百度,代码,名字,最新,实时,Lin

    linux更改用户名命令?

    linux更改用户名命令?,系统,密码,用户,网上,代码,命令,用户名,主机名,终端,

    linux命令行更改ip?

    linux命令行更改ip?,地址,系统,代码,密码,信息,网络,命令,终端,方法,下一步,l

    linux下更改权限命令?

    linux下更改权限命令?,系统,档案,数字,权限,文件,命令,人员,密码,新增,目录,l

    加载变量的linux命令?

    加载变量的linux命令?,工具,系统,名称,环境变量,环境,命令,用户,文件,变量,

    linux命令更改时间?

    linux命令更改时间?,时间,系统,工作,信息,命令,工具,环境,服务,代码,名称,在L

    linux命令行更改时区?

    linux命令行更改时区?,时间,系统,标准,国家,大陆,时区,命令,资料,网上,终端,l

    linux更改属组命令?

    linux更改属组命令?,系统,文件,用户组,命令,名称,所有者,目录,用户,终端,用

    linux变量赋值命令?

    linux变量赋值命令?,标准,数据,数字,时间,系统,名称,变量,赋值,代码,环境,lin

    linux命令以服务方式?

    linux命令以服务方式?,服务,系统,标准,设备,工作,命令,网络,操作系统,文件,

    linux下更改账户命令?

    linux下更改账户命令?,密码,系统,用户,信息,第三,命令,代码,管理,名称,软件,l

    linux设置变量的命令?

    linux设置变量的命令?,工具,环境变量,系统,环境,命令,方法,终端,文件,路径,