non*_*one 10 types programming-languages casting
我一直在读书
与
我知道它们是不同的东西(这里也讨论过)所以我一直在考虑这种方式的示例语言:
所以我的问题是,那里有任何静态弱类型的语言吗?(我想如果不是这样的话就没有意义).以上我的理解/例子是否正确?
强类型和弱类型的定义没有很好地定义,尤其是在仅对一种语言进行评级的情况下。它是比较语言的常用轴,在这种情况下,强类型和弱类型会获得更多含义,但重要的是要了解没有像静态和动态这样的严格定义。使类型系统变弱或变强的原因归结为程序员能够创建类型错误的方式。
很多人会认为C是弱类型的,因为允许程序员强制转换类型。如果仅告诉C它们都是整数,则可以添加指向字符的指针。
int main () {
char c = 'a';
void *p;
(int)c + (int)p;
}
Run Code Online (Sandbox Code Playgroud)
但是,在Haskell中,我可以将on类型显式转换为另一个,但是只有某些类型可以使用。
ord('c') + 10
fromIntegral (2::Int) + 4.13
Run Code Online (Sandbox Code Playgroud)
Java也具有静态类型转换,这使程序员可以使用例如向下转换的对象。这使得静态类型系统不健全。但是,正是出于这个原因,Java具有动态类型检查。是的,Java具有动态和静态类型检查。因此,出于这个原因,我认为许多人会认为Java是强类型的。
如果Perl和Javascript看起来足够像数字,并且会自动使之工作,则它们会将字符串视为数字。
'2 is my favorite number' + 413 == 415 # in Perl
Run Code Online (Sandbox Code Playgroud)
如果要将字符串转换为数字(例如,Scheme),则必须使用执行检查并在字符串不是数字的情况下引发异常的函数进行显式转换。
(= (+ (string->number '2') 413) 415) ; In Scheme
Run Code Online (Sandbox Code Playgroud)
因此,很多人会认为Scheme是强类型的。
在某些语言中,没有任何类型。未键入的Lambda微积分就是这样的一个例子。这显然不是强类型的。一切都是功能。我可以使用教堂数字或成对或字符串的数字,也可以使用各种编码的任何数字,但是值仅表示我同意的含义,并且肯定存在重叠。
就像我说的那样,这些术语的定义不明确,但是以相对方式使用时它们会更有用。例如,我可以断言OCaml比Java具有更强的类型,因为Java允许显式的静态向下转换,而OCaml则不允许。
这些术语并不严格,但很有用。在我看来,要回答您的原始问题,C / C ++是静态的并且是弱类型的,因此符合说明。