为什么常量有类型修饰符?

Why are there type modifiers for constants?

本文关键字:类型 常量 为什么      更新时间:2023-10-16

我不明白文字常量的类型修饰符的目的是什么,比如数字常量:

75 
75u     
75l  
75ul
75lu 

这在什么情况下可能有用?我的意思是,如果您已经为变量类型声明了一个类型修饰符,我认为没有必要这样做。如果有人能帮助我理解这一点,那就太神奇了!谢谢!

奖励问题:"字面"是否与"常量"相同,就像您可以只说"字面"而不是"字面常量"一样?

有时文本必须具有特定类型。例如

void foo(const int&){
// pay myself
}
void foo(const unsigned&){
// reformat my disk
}

然后foo(75)foo(75u)会产生非常不同的结果。

事实上,它非常有用,从 C++11 开始,可以定义自己的文字类型。见 http://en.cppreference.com/w/cpp/language/user_literal

对于整数文字,除了拔示巴的答案之外,它还用于各种情况,例如抑制警告

unsigned int n = somevalue;
...
if (n > 5) dosomething();

更改为if (n > 5U),将不再有警告。

或者当你做这样的事情时

long long x = 1 << 50;

并意识到 x 不是您所期望的,您需要将其更改为

long long x = 1LL << 50;

另一种用法是 C++11 中的auto关键字

auto a = 1;
auto b = 1U;
auto c = 1L;
auto d = 1UL;

以上将导致变量的不同类型

对于浮点文本,使用后缀将产生更正确的结果

long double a = 0.01234567890123456789;
long double a = 0.01234567890123456789L;

这些可能会导致非常非常不同的值。这是因为不带后缀的文本是double文本值,并且将正确舍入为双精度,因此当long double的精度高于double时,将导致精度丢失。由于双舍入,floats 也会发生同样的情况(先到双倍然后浮点,而不是直接将文字舍入为浮点数)

if (0.67 == 0.67f)
std::cout << "Equal";
else 
std::cout << "Not Equal";

以上将打印出"不等于">

初始化float时,强制转换为float和添加f作为后缀有什么区别?

我看到这种情况的最常见情况之一是在75ul << 18中。移位的输入需要有足够的位来允许该移位。75可能是 16 位,在 18 位上移位未定义的行为(坏)。75ul至少为 32 位。

相关文章: