4

我无法理解文字常量的类型修饰符的目的是什么,例如数字常量:

75 
75u     
75l  
75ul
75lu 

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

额外的问题:“字面量”与“常数”相同吗,就像你能说“字面量”而不是“字面量常数”一样吗?

4

3 回答 3

9

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

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

于 2017-03-24T07:53:03.177 回答
4

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

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

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

或者当你做这样的事情

long long x = 1 << 50;

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

long long x = 1LL << 50;

另一种用法是autoC++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";

以上将打印出“不等于”

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

于 2017-03-24T08:10:32.580 回答
0

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

于 2017-03-24T08:53:37.807 回答