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

Why are there type modifiers for constants?

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

75 
75u     
75l  
75ul
75lu 

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

额外问题:"literal" 是否与 "constant" 相同,您可以直接说 "literal" 而不是 "literal constant" 吗?

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

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

对于整数文字,除了 Bathsheba 的回答中的内容外,它还用于各种情况,例如抑制警告

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;

那些may result in very very different values. That's because a literal without suffix is a double literal value and will be rounded correctly to double, hence when long double has more precision than double it'll result in precision lost. The same will occur with floats due to double-rounding(先加倍后浮,而不是直接四舍五入字面量浮)

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

The above will print out "Not Equal"

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