我无法理解文字常量的类型修饰符的用途,例如数值常量:
75
75u
75l
75ul
75lu
在哪些情况下这可能有用?我的意思是如果你已经为变量类型声明了一个类型修饰符,我认为没有必要这样做。如果有人能帮助我理解这一点,那就太棒了!谢谢!
奖金问题:“文字”是否与“常数”相同,您是否只能说“文字”而不是“文字常量”?
答案 0 :(得分:8)
有时文字必须具有特定类型。例如
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
答案 1 :(得分:3)
对于整数文字,除了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。这是因为没有后缀的文字是double
字面值,并且会正确舍入到双倍,因此当long double
的精度高于double
时,它会导致精度丢失。由于double-rounding导致float
s发生同样的情况(首先是双倍然后浮动,而不是直接围绕文字浮动)
if (0.67 == 0.67f)
std::cout << "Equal";
else
std::cout << "Not Equal";
The above will print out "Not Equal"
What is the difference between casting to float
and adding f
as a suffix when initializing a float
?
答案 2 :(得分:0)
我看到这种情况的最常见情况之一是75ul << 18
。转换的输入需要有足够的位来允许该转换。 75
可能是16位,超过18位未定义行为(坏)。 75ul
至少为32位。