Chapel变量声明中的类型放在哪里



在Chapel变量声明中把类型放在哪里?

更具体地说,var a = 42: int;var a: int = 42;之间有什么区别?

这个问题的三个基本背景事实:

  1. Chapel的变量声明语法为:varidenttype=init

  2. Chapel支持编译时类型推断

  3. 在教堂,:扮演两个角色:

    • 在声明新符号时用作类型说明符或约束
    • 应用于表达式时作为强制转换运算符

鉴于此,声明:

var a: int = 42;

说";声明一个名为a的变量,其类型为int,其初始值为42;然而,

var a = 42: int;

说";声明一个名为a的变量,该变量的类型(由于未指定(将从其初始值设定项推断出来,该初始值设定值是转换为int的值42">

现在,在Chapel中,默认情况下42被解释为int,所以这个最终声明实际上与没有什么不同

var a = 42;

上述三项声明具有相同的净效果。

当你混合不同的类型时,事情会变得稍微有趣一些。例如:

var b: int(8) = 42;

表示CCD_ 10应该是初始值为42的8位整数。在Chapel中,尽管42的推断类型是int(这是一个64位的int(,但由于它是一个可以用少于8位表示的文字值,编译器会自动将其向下转换为int(8(。

或者,下变频可以使用以下形式显式:

var b = 42: int(8);  // downcast to int(8) and infer the type

但考虑一下:

var c: int(8) = a;

这将是一个错误,因为a是默认的int变量(64位(,并且Chapel不支持从较宽int表示的变量到较窄int表示的隐式下转换。因此,在这种情况下,您需要将此声明写成两种形式之一:

var c = a: int(8);          // explicitly downcast and infer the type
var c: int(8) = a: int(8);  // give an explicit type and also explicitly downcast to make the initializer compatible

不用说,由于第二种形式有点迂腐,我们倾向于选择两者中的前者。

相关内容

  • 没有找到相关文章

最新更新