为什么常量有类型修饰符?
Why are there type modifiers for constants?
我不明白文字常量的类型修饰符的目的是什么,比如数字常量:
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
时,将导致精度丢失。由于双舍入,float
s 也会发生同样的情况(先到双倍然后浮点,而不是直接将文字舍入为浮点数)
if (0.67 == 0.67f)
std::cout << "Equal";
else
std::cout << "Not Equal";
以上将打印出"不等于">
初始化float
时,强制转换为float
和添加f
作为后缀有什么区别?
我看到这种情况的最常见情况之一是在75ul << 18
中。移位的输入需要有足够的位来允许该移位。75
可能是 16 位,在 18 位上移位未定义的行为(坏)。75ul
至少为 32 位。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 私有类型的静态常量成员
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 从 BubbleSort* 类型的右值初始化 'AssortedSorter&' 类型的非常量引用无效"
- 常量函数,当其参数是对文字类型的引用时
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 为什么"具有常量成员的结构"类型的指针不能指向"具有非常量成员的结构"?
- 常量成员函数中成员变量的类型
- 无法将类型"T&"的非常量左值引用绑定到类型"T"的右值 t++ std::atomic<T>
- 从 Typedef 数据类型中删除常量
- 为什么定义复制构造函数会给我错误:无法将类型 'obj&' 的非常量左值引用绑定到类型为"obj"的右值?
- 将整型常量映射到类型
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- 对于非常量指针类型的参数,未调用具有常量指针模板类型参数的功能
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- 输入参数类型"常量双 *&"是什么意思?
- 从何处获取设备类型常量描述
- 在标头中使用类型常量作为数组大小C++