我有以下课程
class Viewport
{
public:
Viewport();
~Viewport();
void setSize(float x, float y);
private:
float _X;
float _Y;
};
void Viewport::setSize(float x, float y)
{
//Conditionals used to make sure that the viewport stays inside the [0.0f, 1.0f] range
if(x < 0.0f)
_X = 0.0f;
else if(x > 1.0f)
_X = 1.0f;
else
_X = x;
if(y < 0.0f)
_Y = 0.0f;
else if(y > 1.0f)
_Y = 1.0f;
else
_Y = y;
}
Run Code Online (Sandbox Code Playgroud)
我创建了视口矢量
Viewport vps[3];
uint _NumCascades = 3;
for(uint i = 0; i < _NumCascades; i++)
vps[i].setSize(i * (1.0f/_NumCascades), 0.0f);
Run Code Online (Sandbox Code Playgroud)
当i == 1和i==2在线时发生奇怪的错误,_X = x;因为它_X被分配了值1051372203而不是0.33333334f
所有属性,尤其是_X和_Y,都是为编译器保留的,并且编译器使用_X(因为它太短)而不是其他东西并且让代码混淆是不可能的.
C++语言保留以实现的下划线开头的名称子集.在这种情况下,所有范围/案例都保留下划线和主要资本.这些规则并不是非常复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上引入下划线.
1051372203 0x3eaaaaab的位模式是IEEE754格式的float值的位模式1.0f/3.因此赋值工作,并且在某些地方,位模式被解释为整数.因为i == 0,int(或unsigned int)0和float0 的位模式是相同的.
无法从发布的代码中推断出发生这种情况.