【发布时间】:2021-08-26 20:18:36
【问题描述】:
我正在为我的认证考试做 C++ 测试,我遇到了这个我不明白的练习: (问题是下面程序的输出是什么)
#include <iostream>
using namespace std;
class A {
public :
float v;
float set(float v) {
A::v += 1.0;
A::v = v+1.0;
return v;
}
float get(float v){
v +=A::v;
return v;
}
};
int main()
{
A a;
cout<< a.get(a.set(a.set(0.5)));
return 0;
}
我预计 set 函数的第一行会出现错误,因为 A::v 从未初始化,但我的程序编译了,似乎 A::v 默认值为 0.. 谁能解释一下为什么没有编译错误?
【问题讨论】:
-
谢谢你的链接,很有趣,但它没有回答我的问题——人们在答案中说原语没有初始化(这也是我所期望的),所以这没有解释set函数的第一行如何编译
-
您需要了解它是不可预测的。它可以像你的情况一样为零,但也可以是别的东西。有规律。它实际上回答了你的问题。如果你把踏板踩到金属上,闭上眼睛开车穿过繁忙的十字路口,你可能会撞车,也可能不会撞车。如何回答问题:为什么我没有崩溃?
-
就 C++ 标准而言,程序具有未定义的行为,这就是我们所能说的。可能是某些实现总是给出
2,或者通常给出2,或者一直给出2,直到该计算机上的其他东西碰巧为程序的虚拟地址空间提供了不同的RAM,或者它一直等到最坏的情况除了输出2之外,可能还有时间做点什么。 -
Pearson Vue 无可挑剔的机构声望需要引用。
-
“这就是为什么我相信这个程序的工作原理可能有更深层次的东西” - 你的意思是一些特殊情况,因为一些模糊的原因而不是 UB?听起来很捏造。无论如何,您是否认为您以 UB 来回答实际上正是他们可能想听到的答案?我的意思是,除此之外,理解代码应该做什么,忽略 UB,这太容易了,对吧?
标签: c++ function default-value