我无法理解文字常量的类型修饰符的目的是什么,例如数字常量:
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
对于整数文字,除了 Bathsheba 的答案之外,它还用于各种情况,例如抑制警告
unsigned int n = somevalue;
...
if (n > 5) dosomething();
更改为if (n > 5U)
,将不再有警告。
或者当你做这样的事情
long long x = 1 << 50;
并意识到 x 不是您所期望的,您需要将其更改为
long long x = 1LL << 50;
另一种用法是auto
C++11 中的关键字
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
它时会导致精度丢失。float
由于双舍入,s 也会发生同样的情况(首先加倍然后浮动,而不是直接将文字四舍五入到浮动)
if (0.67 == 0.67f)
std::cout << "Equal";
else
std::cout << "Not Equal";
我看到的最常见的情况之一是在75ul << 18
. 移位的输入需要有足够的位来允许移位。75
可能是 16 位,在 18 位上进行移位未定义行为(坏)。75ul
至少为 32 位。