gpt4 book ai didi

programming-languages - 为什么编程语言允许从整数到shortint赋值?

转载 作者:行者123 更新时间:2023-12-01 23:00:52 25 4
gpt4 key购买 nike

program TypeCategory;
{$R+}
var
sInt : shortint;
iInt : integer;
begin
readln(iInt);
sInt := iInt;
writeln(sInt);
end.

考虑到上面的示例,pascal语言确实允许从 integershortint分配,甚至允许 longintshortint的分配而无需显式类型转换。也就是说,pascal允许在类型category(这里是整数类型)内进行分配。

Pascal以 strongly typed闻名,但是为什么允许这种 weakly typed呢?我认为这种语法会鼓励代码不一致。

这种语法的优点是什么?除了著名的C和C++之外,还有其他使用这种语法的语言吗?

谢谢。

编辑:
我只测试了 turbo pascalfree pascal with fpc/objfpc/tp/delphi model。此外, gcc/g++msvc会产生相同的结果。也就是说,从 int(在我的计算机上为4字节)到 short int(大小为2)的辅助不会触发任何编译错误,您可以设置适当的选项以使编译器生成 possible lose of data警告。

最佳答案

第1部分。关于定义
首先,您称哪种语言和实现方式为“pascal”? 如果您谈论的是ISO Pascal,它比很多年前已经死了。如果您在谈论其他语言或实现,请提供更多信息。
其次(如Teun D所述),术语强类型没有定义。看一看Wikipedia article on strong typing

However, these terms have been given such a wide variety of meanings over the short history of computing that it is often difficult to know, out of context, what an individual author means when using them.


假设我们遵循Luca Cardelli在Wikipedia页面上描述的文章Typeful Programming的定义:

Luca Cardelli's article Typeful Programming describes strong typing simply as the absence of unchecked run-time type errors. In other writing, the absence of unchecked run-time errors is referred to as safety or type safety; Tony Hoare's early papers call this property security.


无论如何,所描述的行为不能被归类为静态(或安全)键入规则。我个人真的不喜欢这个hmmm ...嗯,这不是功能,那是一个错误。 =)
第2部分。
我认为问题不在于这种弱类型,而在于某些语言中可用的各种整数类型。

Are there any other languages which applied this kind of syntax,except the famous C and C++?


我认为几乎每种具有各种整数类型的静态类型语言都具有这种行为。最好在早期拥有这个SHORTINT和所有爵士乐以节省内存。但是现在,几乎每台PC都有大约1 GB的内存和更多的RAM ...假设我们有一百万个4字节的INTEGER,而不是2字节的SHORTINT。它只有大约4 MB的RAM,而不是2 MB。我认为,如果没有您描述的所有奇怪行为,这是合理的价格。
快速浏览一下Wirth的Oberon-07( Language Report, PDF)。只有一种整数类型-32位INTEGER。
也可以用int类型提到Python(或者可能是其他现代动态类型的语言),该类型表示无限范围内的数字,仅受可用(虚拟)内存的限制。
因此,您可以看到趋势-整数类型的多样性是70年代的生存期。 =)

What are pros for this kind of syntax?


优点是(可能)减少了冗长性。这种静态类型的语言已经非常冗长,因此,如果我们决定添加一些明确的整数类型转换(如Wirth在Oberon-2中所做的那样(请看SHORT()和LONG()函数)),它们将变得更加冗长。作为一种折衷,可以允许隐式转换。同样在许多语言中,整数类型变量的实际大小不是固定的,并且在一个实现与另一个实现之间是不同的。唯一可用的信息是size(shortint)<= size(int)。在相等的情况下,显式转换看起来很奇怪。
第3部分。Dithyramb到Oberon-2 =)
顺便说一下,不要对Pascal太过警惕。 已死,但在 Oberon-2中,尼克劳斯·沃思(Niklaus Wirth)更正了他的错误。
在语言报告的 Chapter 6中,您可以找到有关类型的信息。对于我们的讨论,重要的声明是:

Types 3 to 5 are integer types, types 6 and 7 are real types, and together they are called numeric types. They form a hierarchy; the larger type includes (the values of) the smaller type:LONGREAL >= REAL >= LONGINT >= INTEGER >= SHORTINT


Chapter 9中,我们可以阅读有关分配的信息:

The expression must be assignment compatible with the variable


最后在附录A中:

Assignment compatible

An expression e of type Te is assignment compatible with a variable v of type Tv if one of the following conditions hold:

Te and Tv are the same type;

Te and Tv are numeric types and Tv includes Te;

...


所以我们到了。您不能将INTEGER表达式分配给SHORTINT变量。如果您有兴趣,也可以看看 Component Pascal,它是Oberon-2的较小变型和改进。 BlackBox Component Builder是Windows的IDE。

回应贾斯汀·史密斯的评论。

I am amazed he said the larger type includes (the values of) the smaller type: LONGREAL >= REAL >= LONGINT >= INTEGER >= SHORTINT, given that there are LONGINTS that cannot be expressed as "REAL"s.


我对你的陈述有些困惑

there are LONGINTS that cannot be expressed as "REAL"s


实际上在我上面提到的我的机器IDE上有

MAX(LONGINT) = 9223372036854775807

MAX(REAL) = 1.797693134862316E+308


因此,您可以将每个LONGINT表示为实数。但是表示可能不准确。 我想您实际上是在谈论它,但在这里我们谈论的是不同的整数类型转换。 REAL和INTEGER之间的转换是另一回事。命名错误和令人困惑的故事。从数学的角度来看,实数实际上不是 real numbers。它们是一些近似表示。可以使用 rational numbers近似值(将分子和分母存储为整数),但是常见的方法是使用浮点近似值。 The IEEE Standard for Floating-Point Arithmetic(也称为IEEE 754)是浮点计算使用最广泛的标准。
每个人都应该知道,实数不是实数,而是IEEE 754标准中描述的数。每个人都应该阅读 "What Every Computer Scientist Should Know About Floating-Point Arithmetic"来阐明一些要点。
但这是另一个故事... =)

关于programming-languages - 为什么编程语言允许从整数到shortint赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2081639/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com