另外,两者之间是否存在关联?


当前回答

答案已经在上面给出了。试图区分强与周,静态与动态的概念。

什么是强类型VS弱类型?

强类型:不会自动从一种类型转换为另一种类型

在Go或Python这样的强类型语言中,“2”+ 8会引发类型错误,因为它们不允许“类型强制”。

弱类型(松散类型):将自动转换为一种类型为另一种类型: 弱类型语言(如JavaScript或Perl)不会抛出错误,在这种情况下,JavaScript的结果是'28',Perl的结果是10。

Perl的例子:

my $a = "2" + 8;
print $a,"\n";

将其保存到main.pl并运行perl main.pl,您将得到输出10。

什么是静态和动态类型?

在编程中,程序员根据检查变量类型的点来定义静态类型和动态类型。静态类型语言是指在编译时进行类型检查的语言,而动态类型语言是指在运行时进行类型检查的语言。

静态:运行前检查的类型 动态:在执行期间动态检查类型

这是什么意思?

在Go中,它在运行前检查输入(静态检查)。这意味着它不仅翻译和类型检查它正在执行的代码,而且它将扫描所有的代码,甚至在代码运行之前就会抛出类型错误。例如,

package main

import "fmt"

func foo(a int) {
    if (a > 0) {
        fmt.Println("I am feeling lucky (maybe).")
    } else {
        fmt.Println("2" + 8)
    }
}

func main() {
    foo(2)
}

在main中保存此文件。去运行它,你会得到编译失败的消息。

go run main.go
# command-line-arguments
./main.go:9:25: cannot convert "2" (type untyped string) to type int
./main.go:9:25: invalid operation: "2" + 8 (mismatched types string and int)

但这种情况不适用于Python。例如,下面的代码块将在第一次foo(2)调用时执行,而在第二次foo(0)调用时失败。这是因为Python是动态类型的,它只翻译和类型检查它所执行的代码。对于foo(2), else块从未执行,因此“2”+ 8甚至从未被查看,对于foo(0)调用,它将尝试执行该块,但失败。

def foo(a):
    if a > 0:
        print 'I am feeling lucky.'
    else:
        print "2" + 8
foo(2)
foo(0)

您将看到以下输出

python main.py
I am feeling lucky.
Traceback (most recent call last):
  File "pyth.py", line 7, in <module>
    foo(0)
  File "pyth.py", line 5, in foo
    print "2" + 8
TypeError: cannot concatenate 'str' and 'int' objects

其他回答

答案已经在上面给出了。试图区分强与周,静态与动态的概念。

什么是强类型VS弱类型?

强类型:不会自动从一种类型转换为另一种类型

在Go或Python这样的强类型语言中,“2”+ 8会引发类型错误,因为它们不允许“类型强制”。

弱类型(松散类型):将自动转换为一种类型为另一种类型: 弱类型语言(如JavaScript或Perl)不会抛出错误,在这种情况下,JavaScript的结果是'28',Perl的结果是10。

Perl的例子:

my $a = "2" + 8;
print $a,"\n";

将其保存到main.pl并运行perl main.pl,您将得到输出10。

什么是静态和动态类型?

在编程中,程序员根据检查变量类型的点来定义静态类型和动态类型。静态类型语言是指在编译时进行类型检查的语言,而动态类型语言是指在运行时进行类型检查的语言。

静态:运行前检查的类型 动态:在执行期间动态检查类型

这是什么意思?

在Go中,它在运行前检查输入(静态检查)。这意味着它不仅翻译和类型检查它正在执行的代码,而且它将扫描所有的代码,甚至在代码运行之前就会抛出类型错误。例如,

package main

import "fmt"

func foo(a int) {
    if (a > 0) {
        fmt.Println("I am feeling lucky (maybe).")
    } else {
        fmt.Println("2" + 8)
    }
}

func main() {
    foo(2)
}

在main中保存此文件。去运行它,你会得到编译失败的消息。

go run main.go
# command-line-arguments
./main.go:9:25: cannot convert "2" (type untyped string) to type int
./main.go:9:25: invalid operation: "2" + 8 (mismatched types string and int)

但这种情况不适用于Python。例如,下面的代码块将在第一次foo(2)调用时执行,而在第二次foo(0)调用时失败。这是因为Python是动态类型的,它只翻译和类型检查它所执行的代码。对于foo(2), else块从未执行,因此“2”+ 8甚至从未被查看,对于foo(0)调用,它将尝试执行该块,但失败。

def foo(a):
    if a > 0:
        print 'I am feeling lucky.'
    else:
        print "2" + 8
foo(2)
foo(0)

您将看到以下输出

python main.py
I am feeling lucky.
Traceback (most recent call last):
  File "pyth.py", line 7, in <module>
    foo(0)
  File "pyth.py", line 5, in foo
    print "2" + 8
TypeError: cannot concatenate 'str' and 'int' objects

强类型意味着类型之间的转换之间存在限制。

静态类型意味着类型不是动态的——一旦创建了变量,就不能更改变量的类型。

两者都是两个不同轴上的极点:

强类型与弱类型 静态类型vs.动态类型

强类型意味着变量不会自动从一种类型转换为另一种类型。弱类型则相反:Perl可以在数值上下文中使用“123”这样的字符串,方法是自动将其转换为int型123。像python这样的强类型语言不会这样做。

静态类型意味着,编译器在编译时计算出每个变量的类型。动态类型语言只在运行时确定变量的类型。

恕我直言,最好完全避免这些定义,不仅没有一致的术语定义,确实存在的定义倾向于关注技术方面,例如,混合类型上的操作是否允许,如果不允许,是否存在绕过限制的漏洞,例如使用指针工作。

相反,再次强调这是一种观点,人们应该关注这个问题:类型系统是否使我的应用程序更可靠?一个特定于应用程序的问题。

例如:如果我的应用程序有一个名为加速度的变量,那么显然,如果变量的声明和使用方式允许将值“星期一”分配给加速度,这是一个问题,因为显然加速度不能是工作日(和字符串)。

Another example: In Ada one can define: subtype Month_Day is Integer range 1..31;, The type Month_Day is weak in the sense that it is not a separate type from Integer (because it is a subtype), however it is restricted to the range 1..31. In contrast: type Month_Day is new Integer; will create a distinct type, which is strong in the sense that that it cannot be mixed with integers without explicit casting - but it is not restricted and can receive the value -17 which is senseless. So technically it is stronger, but is less reliable. Of course, one can declare type Month_Day is new Integer range 1..31; to create a type which is distinct and restricted.

一个并不意味着另一个。对于静态类型的语言来说,这意味着所有变量的类型都是在编译时已知或推断出来的。

强类型语言不允许将一种类型用作另一种类型。C是一种弱类型语言,是强类型语言不允许的一个很好的例子。在C语言中,你可以传递错误类型的数据元素,它不会报错。在强类型语言中你不能这样做。