为什么类型长赋值中的文本值在 C++ 的末尾仍然有一个'L'?
Why does the literal value in a type long assignment still have an 'L' at the end in C++?
似乎找不到这个问题的答案,我相信这很简单,但只是想了解这个问题,以便我可以继续前进。
我正在看整数类型,我想知道为什么:
long number = 645456645;
的效果与
相同long number = 654456654L;
在结尾用字母"L"有什么意义?
我正在看整数类型,我想知道为什么这个-
long number = 645456645;
与-
的效果相同long number = 654456654L;
严格来说,两者是不等价的。
- 在前者中,您的文字
645456645
具有int
类型,并且在初始化时将转换为long
。 - 在后者中,它已经是
long
,因此不执行转换。
在这个简单的示例中,显然没有功能差异,但是在long
的范围与int
的范围不相同的平台上,您可能会发现必须首先使用L
后缀来实际获得有效的文字。
文字类型说明符决定文字的类型
裸整数字面值总是具有它们适合的最小的int
类型,但是使用说明符可以显式地指定您希望考虑的小类型:
12: int 12U: unsigned int
12L: long int 12UL: unsigned long int
12LL: long long int 12ULL: unsigned long long int
想象一下:
template <typename T> void foo(T, T);
现在foo(12, 12L)
失败了,因为它是模糊的,但foo(12U, 12U)
工作(T
被推断为unsigned int
)。因此,当您需要控制文字表达式的实际类型时,文字类型说明符非常重要。
用来指定整型文字的类型。L
使其为long
, U
使其为unsigned
它的用法如下:
long long number = 123456789123456;
long long number = 123456789123456LL;
一些编译器会抱怨第一个,因为123456789123456
不适合默认的int
。
另一个使用它的情况是消除重载函数之间的歧义。
编辑:(见注释)
main.cpp
int main(){
long long number = 123456789123456;
return 0;
}
编译得到:
alex-desktop:~/Desktop/vm_shared> g++ main.cpp
main.cpp:3: warning: integer constant is too large for ‘long’ type
alex-desktop:~/Desktop/vm_shared>
gcc version: 4.4.3
通常情况下,这样的文字将被解释为整数,偶尔你想指定一个对于整数(> INT_MAX)来说太大的文字,在这些情况下,你使用这样的后缀,L
和LL
(U
等),这告诉编译器将文字视为long
(和long long
)
相关文章:
- 有一个打印语句的函数是一种糟糕的编程实践吗
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 有没有可能有一个只有ADL才能找到的非好友功能
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 我在 .h 中有一个枚举类,并且在.cpp错误中有一个运算符重载:与"运算符<<不匹配
- 如何在 Gnuplot 中分别绘制 2 个文件数据?我有一个文件"sin.txt",另一个文件"cos.txt",我想将它们分别绘制在一个图表上
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 我的输出中有一个额外的 0,为什么会这样
- 节点是否为空,即使它有一个值?
- 将数组信息存储到 c++ 向量中有一个"Access violation reading location"
- 在 Stream C++ 文本之前有一个额外的换行符
- 我可以有一个 ELI5 作为参考和指针以及何时使用它们吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 我有一个类,它创建了另一个类的实例.如何将变量通过第一个类传递到第二个类的实例化中?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 有一个构造函数,但有两个析构函数
- 我有一个关于C++提升的问题:: asio 和 std :: 异步