Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么需要在分配给C+;的值之后附加L或F+;常数 我在网上查了不少地方,似乎找不到一个很好的解释,说明为什么我们应该在赋值给C++常量之后追加F或L。例如: const long double MYCONSTANT = 3.0000000L;_C++_Syntax_Types_Constants - Fatal编程技术网

为什么需要在分配给C+;的值之后附加L或F+;常数 我在网上查了不少地方,似乎找不到一个很好的解释,说明为什么我们应该在赋值给C++常量之后追加F或L。例如: const long double MYCONSTANT = 3.0000000L;

为什么需要在分配给C+;的值之后附加L或F+;常数 我在网上查了不少地方,似乎找不到一个很好的解释,说明为什么我们应该在赋值给C++常量之后追加F或L。例如: const long double MYCONSTANT = 3.0000000L;,c++,syntax,types,constants,C++,Syntax,Types,Constants,有人能解释为什么这是必要的吗?类型声明不意味着分配给MYCONSTANT的值是一个长双精度值吗?上面这一行和下面这一行有什么区别 const long double MYCONSTANT = 3.0000000; // no 'L' appended 唷 否,该声明并不意味着初始值设定项具有特定类型。无论初始化的变量是什么类型,初始化的类型都是相同的 因此,如果您初始化一个长双精度,但使用双精度进行初始化,那将是非常愚蠢的。通过使用L后缀,可以说它是long double类型的浮

有人能解释为什么这是必要的吗?类型声明不意味着分配给MYCONSTANT的值是一个长双精度值吗?上面这一行和下面这一行有什么区别

const long double MYCONSTANT = 3.0000000;        // no 'L' appended

否,该声明并不意味着初始值设定项具有特定类型。无论初始化的变量是什么类型,初始化的类型都是相同的


因此,如果您初始化一个
长双精度
,但使用
双精度
进行初始化,那将是非常愚蠢的。通过使用
L
后缀,可以说它是
long double
类型的浮点文本。附加到整数文本后,它将表示该类型具有
long int

当存在文本值时,它被认为是某种类型。3.0被视为双精度3被视为整数。3.0F使其成为浮点型而不是双精度3.0L使其成为长双精度而不是双精度。3L是长整数而不是整数


至少在G++中,VS08两个例子都很好。默认情况下,

< P>浮点常量有C++的类型<代码>双< />代码。由于
长双精度
双精度
更精确,因此当
长双精度
常量转换为
双精度
时,可能会丢失有效数字。要处理这些常量,需要使用
L
后缀来保持
long double
精度。比如说,

long double x = 8.99999999999999999;
long double y = 8.99999999999999999L;
std::cout.precision(100);
std::cout << "x=" << x << "\n";
std::cout << "y=" << y << "\n";
这里发生的情况是,
x
在赋值之前被舍入,因为常量被隐式转换为
double
,并且
8。9999999999999999
不能表示为64位浮点数。(请注意,
long double
表示法也不是完全精确的。
9
s的第一个字符串后面的所有数字都试图使用96个二进制位尽可能接近十进制数
8.999999999999999
。)

在您的示例中,不需要使用
L
常量,因为
3.0
可以精确地表示为
double
long double
double
常量值被隐式转换为
长double
,而不会损失任何精度


F
的情况并不明显。正如Zan Lynx指出的那样,它可以帮助解决过载问题。我不确定,但它也可以避免一些细微的舍入错误(即,将
浮点编码可能会给出与将
编码为双精度后舍入为
浮点值不同的结果)。

您的示例不需要它,但据我所知,对文本值使用显式类型的最大原因是确保调用了正确的函数重载

这会在构造函数、运算符重载等方面产生很大的差异


有时没有方便的方法将文本转换为正确的类型,因此必须使用静态转换或在文本周围放置构造函数。

请注意,对于整数,如果有十六进制或八进制文本,还有其他规则。没有任何后缀,如果十六进制或八进制文字的值不适合相应的有符号类型(int、unsigned int、long、unsigned long),则十六进制或八进制文字也可能成为无符号文字。在C++03中,根据类型(long、unsigned long)的值和范围,追加L还将为十进制文本提供一个无符号类型。然而,在C++0x中,无论是否附加后缀(long,long-long),十进制文字总是有符号类型。我觉得很混乱…但是编译器可以从声明中解决这个问题。如果我说“float a=1.0”或“double a=1.0”,你不需要输入“int a=1i”或“char a=1c”,这应该很明显,我指的是float/double。你要求编译器进行类型推断,即使是整数常量,它也不会这样做。默认情况下,整数常量为int。编译器不会警告您将int常量赋值给char,只要它在char范围内。它可以尝试对浮点常量发出警告,但我想转换规则太复杂了(整数边界要简单得多)。您可以将所有字符值作为int文本写入。炫耀点文字的问题在于它们是十进制的,而不是二进制的。因此,即使
0.1
也不适合长双精度。但是考虑到这些限制,
0.1L
是比
0.1
@mgb更好的近似值:编译器可以从某些语言的声明中计算出来。在C++中,文字常量的类型完全由标准指定,而以文字方式推断的编译器,无论您注意到什么类型都将是不符合的。C++常见问题:可能的副本
x=9
y=8.9999999999999999895916591441391574335284531116485595703125