C++ 每个代码段的编译器行为有什么不同吗? 请考虑以下代码:

C++ 每个代码段的编译器行为有什么不同吗? 请考虑以下代码:,c++,comparison,C++,Comparison,一, uint16 a=0x0001; 如果(a

一,

uint16 a=0x0001;
如果(a<0x0002)
{
//做点什么
}
二,

uint16 a=0x0001;
如果(a
三,

uint16 a=0x0001;
如果(a
四,

uint16 a=0x0001;
uint16 b=0x0002;
if(a
编译器在backgorund中做什么?进行上述测试的最佳(正确)方法是什么

p、 对不起,我找不到更好的标题:)

编辑:

值0x0001和0x0002只是示例。可以有任何2字节的值代替


提前谢谢你

由于您使用的数字都是一位数且小于10,所以十进制和十六进制之间没有区别。除非您以意外的方式定义了
uint16
,否则强制转换和/或
static\u cast
应该没有任何区别。直接使用常量和初始化变量,然后使用变量之间应该没有实际区别


你应该关注的是确保读者能够理解正在发生的事情——给出有意义的名称,这样就很明显你为什么要比较这些项目。因为强制转换并不能真正完成任何事情,所以最好不要使用它们。

最后一个示例是最好的代码,因为您不应该在代码中使用“魔法常量”

事实上,最好的方法是使b常量(编辑)并使用有意义的名称:

uint16当前速度=0x0001;
常数uint16 cMaxSpeed=0x0002;
if(当前速度

除此之外,您的示例之间的“幕后”差别很小。

通常最好避免在代码中使用未命名的“神奇”数字,因为维护人员很难理解数字的含义。因此,命名常量是一种很好的做法。因此,不要做第一件事

<>在C++中,最好使用STATICE-CAST,而不是C风格的铸件。我相信关于为什么会出现这种情况可能还有其他问题,但这里最好的参考是Meyers(有效的C++)。出于这个原因,我们更喜欢3而不是2,但3仍然存在幻数问题

四是最好的,除了变量名没有意义,而且一个或两个变量都是
const
可能有意义


我不确定在编译代码方面是否有任何区别,但这可能是由于文字被解释为uint16以外的内容。例如,它可能是一个uint32,尽管您仍然应该得到预期的结果

如果仅此而已,则没有差异(GCC,-O2)。在所有情况下,
//do something
都是无条件执行的


所以这只是一个风格问题。

这与十进制和十六进制有什么关系?@Kenny:,任何称职的编译器都会为这些选项输出完全相同的编译代码。显然,给b起一个名字,实际上是对它的意思的描述。@MarkB-的确,很明显,我没有费心指出它!我编辑了我的答案,以包含这一非常重要的一点。
uint16 a = 0x0001;

if(a < 0x0002)
{
    // do something
}
uint16 a = 0x0001;

if(a < uint16(0x0002))
{
    // do something
}
uint16 a = 0x0001;

if(a < static_cast<uint16>(0x0002))
{
    // do something
}
uint16 a = 0x0001;
uint16 b = 0x0002;

if(a < b)
{
    // do something
}
uint16 currentSpeed = 0x0001; 
const uint16 cMaxSpeed = 0x0002; 

if (currentSpeed < cMaxSpeed) 
{ 
    // do something 
}