首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型转换与类型消歧

类型转换与类型消歧
EN

Stack Overflow用户
提问于 2014-02-16 22:54:08
回答 2查看 146关注 0票数 0

类型转换和消歧都使用强制转换。在进一步的研究中,我发现这两个例子:

代码语言:javascript
复制
(double) 3;   // conversion
(double) 3.0; // disambiguation

有人能解释一下这个区别吗?我看不出来。这个区别在C++中也有效吗?

编辑

最初的代码片段是这样的:

代码语言:javascript
复制
(float) 3;   // conversion
(float) 3.0; // disambiguation

但是将其改为double,因为浮点文字在现代编译器中不再是float,而且这个问题没有任何意义。我希望我正确地解释了这些评论,并对编辑后已经发布的任何答案表示赞同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-17 00:47:23

这类似于在任何语言中对程序员提出的许多要求。我将给出第一个例子,它不同于您所询问的内容,但应该更好地说明为什么无论您在哪里看到它都会出现这种情况。

假设我定义了一个常量变量:

代码语言:javascript
复制
static const a = 5;

现在,什么是“a”?我们再试一次。

代码语言:javascript
复制
static const max_number_of_buttons = 5;

这是显式变量命名。它要长得多,而且从长远来看,它可能会拯救你的屁股。在C++中,在这方面还有另一个潜在的问题:成员变量的命名,以及局部变量和参数变量的命名。所有3种方法都应该使用不同的方案,因此当您读取C++函数时,您会确切地知道它在做什么。有一个小函数,它不告诉您有关变量的任何信息:

代码语言:javascript
复制
void func(char a)
{
    char b;
    b = a;
    p = b * 3;
    g = a - 7;
}

使用正确的命名约定,您将知道p和g是局部变量、函数的参数、变量成员还是全局变量。(这个函数非常小,所以您有一个想法,想象一下一个由1000行代码组成的函数-我看过这些代码,在几页之后,您不知道是什么,而且经常会以非常难以调试的方式隐藏变量.)

代码语言:javascript
复制
void func(char a)
{
    char b;
    b = a;
    g_p = b * 3;
    f_g = a - 7;
}

我的个人习惯是为全局变量添加g_,为变量成员添加f_。此时,我不区分局部变量和参数变量..。虽然您可以编写p_a,而不是只为参数编写a,但现在您知道了所有不同类型的变量。

好的,在消除变量名的歧义方面,这是有意义的,尽管在您的例子中,您具体询问的是类型。让我看看..。

Ada以其非常强的变量类型而闻名。例如:

代码语言:javascript
复制
type a is 1 .. 100;
type b is 1 .. 100;

A: a;
B: b;

A := 5;
B := A;

最后一行不编译。尽管类型a和类型b看起来很相似,但编译器将它们视为不同的数值类型。换句话说,这是相当明确的。要使它在Ada中运行,您必须按以下方式铸造A:

代码语言:javascript
复制
B := B'(A);

在C/C++中,您可以声明两种类型和变量:

代码语言:javascript
复制
typedef int a;
typedef int b;

a A;
b B;

A = 5;
B = A;

这与C/C++中的情况一样,因为类型a和类型b被认为完全相同(int,尽管您给它们命名为ab)。这是非常不明确的。所以写这样的东西:

代码语言:javascript
复制
A = (b) 5;

将显式地告诉您,您从b类型开始查看该5,并将其(隐式)转换为在赋值中键入a。您还可以以这种方式编写它以使其完全显式化:

代码语言:javascript
复制
A = a(b(5));

大多数C/C++程序员会告诉您,这是愚蠢的,这就是为什么我们的软件中有这么多错误,不幸的是。Ada保护您不混合胡萝卜和香蕉,因为即使两者都被定义为整数,它们都是不同的类型。

现在有一种方法可以缓和C/C++中的这个问题,尽管几乎从未使用过,但是您可以为每个对象使用一个类,包括数字。然后,您将为每种不同的类型都有一个特定的类型(因为类A和类B的变量不能只是混合在一起,除非通过为此目的添加函数来允许这样做)。坦白地说,即使是我也不这么做,因为写任何长度的C程序都会有太多的工作.

正如Juri所说: 3.0和(double) 3.0是完全相同的东西,而(双重)铸造是多余的(就像你两次说同样的话一样)。然而,它可能会帮助你后面的人看到,你真的想让这个数字变成一个双倍,而不是语言说的最终可能是什么。

票数 0
EN

Stack Overflow用户

发布于 2014-02-16 23:26:30

(double) 3是从整数(int)到浮点数(double)的转换。

(double) 3.0中的转换是无用的,它什么也不做,因为它已经是double了。

未加后缀的浮动常量的类型为double。

(ANSI C标准,§3.1.3.1浮动常数)

这个答案对于C是有效的,在C++中应该是相同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21817897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档