类型转换和消歧都使用强制转换。在进一步的研究中,我发现这两个例子:
(double) 3; // conversion
(double) 3.0; // disambiguation有人能解释一下这个区别吗?我看不出来。这个区别在C++中也有效吗?
编辑
最初的代码片段是这样的:
(float) 3; // conversion
(float) 3.0; // disambiguation但是将其改为double,因为浮点文字在现代编译器中不再是float,而且这个问题没有任何意义。我希望我正确地解释了这些评论,并对编辑后已经发布的任何答案表示赞同。
发布于 2014-02-17 00:47:23
这类似于在任何语言中对程序员提出的许多要求。我将给出第一个例子,它不同于您所询问的内容,但应该更好地说明为什么无论您在哪里看到它都会出现这种情况。
假设我定义了一个常量变量:
static const a = 5;现在,什么是“a”?我们再试一次。
static const max_number_of_buttons = 5;这是显式变量命名。它要长得多,而且从长远来看,它可能会拯救你的屁股。在C++中,在这方面还有另一个潜在的问题:成员变量的命名,以及局部变量和参数变量的命名。所有3种方法都应该使用不同的方案,因此当您读取C++函数时,您会确切地知道它在做什么。有一个小函数,它不告诉您有关变量的任何信息:
void func(char a)
{
char b;
b = a;
p = b * 3;
g = a - 7;
}使用正确的命名约定,您将知道p和g是局部变量、函数的参数、变量成员还是全局变量。(这个函数非常小,所以您有一个想法,想象一下一个由1000行代码组成的函数-我看过这些代码,在几页之后,您不知道是什么,而且经常会以非常难以调试的方式隐藏变量.)
void func(char a)
{
char b;
b = a;
g_p = b * 3;
f_g = a - 7;
}我的个人习惯是为全局变量添加g_,为变量成员添加f_。此时,我不区分局部变量和参数变量..。虽然您可以编写p_a,而不是只为参数编写a,但现在您知道了所有不同类型的变量。
好的,在消除变量名的歧义方面,这是有意义的,尽管在您的例子中,您具体询问的是类型。让我看看..。
Ada以其非常强的变量类型而闻名。例如:
type a is 1 .. 100;
type b is 1 .. 100;
A: a;
B: b;
A := 5;
B := A;最后一行不编译。尽管类型a和类型b看起来很相似,但编译器将它们视为不同的数值类型。换句话说,这是相当明确的。要使它在Ada中运行,您必须按以下方式铸造A:
B := B'(A);在C/C++中,您可以声明两种类型和变量:
typedef int a;
typedef int b;
a A;
b B;
A = 5;
B = A;这与C/C++中的情况一样,因为类型a和类型b被认为完全相同(int,尽管您给它们命名为a和b)。这是非常不明确的。所以写这样的东西:
A = (b) 5;将显式地告诉您,您从b类型开始查看该5,并将其(隐式)转换为在赋值中键入a。您还可以以这种方式编写它以使其完全显式化:
A = a(b(5));大多数C/C++程序员会告诉您,这是愚蠢的,这就是为什么我们的软件中有这么多错误,不幸的是。Ada保护您不混合胡萝卜和香蕉,因为即使两者都被定义为整数,它们都是不同的类型。
现在有一种方法可以缓和C/C++中的这个问题,尽管几乎从未使用过,但是您可以为每个对象使用一个类,包括数字。然后,您将为每种不同的类型都有一个特定的类型(因为类A和类B的变量不能只是混合在一起,除非通过为此目的添加函数来允许这样做)。坦白地说,即使是我也不这么做,因为写任何长度的C程序都会有太多的工作.
正如Juri所说: 3.0和(double) 3.0是完全相同的东西,而(双重)铸造是多余的(就像你两次说同样的话一样)。然而,它可能会帮助你后面的人看到,你真的想让这个数字变成一个双倍,而不是语言说的最终可能是什么。
发布于 2014-02-16 23:26:30
(double) 3是从整数(int)到浮点数(double)的转换。
(double) 3.0中的转换是无用的,它什么也不做,因为它已经是double了。
未加后缀的浮动常量的类型为double。
(ANSI C标准,§3.1.3.1浮动常数)
这个答案对于C是有效的,在C++中应该是相同的。
https://stackoverflow.com/questions/21817897
复制相似问题