强类型和弱类型的区别
讨论一门编程语言是强类型、弱类型、动态、静态,虽然有点孔乙己,但可增强对语言的理解。
强类型:所有变量需指定数据类型后再使用,例如C++/Java 需先声明 int num = 123;
强/弱类型是指类型检查的严格程度的,有三种类型:
1)无类型的不检查,甚至不区分指令和数据
2)弱类型的检查很弱,仅能严格的区分指令和数据
3)强类型的则严格的在编译期进行检查。
强类型语言,在没有强制类型转化前,不允许两种不同类型的变量相互操作。
强类型,偏向于不容忍隐式类型转换,例如Python的int就不能变成double
Java、C#、Python、Apex等都是强类型语言。
弱类型语言,也称为弱类型定义语言,与强类型定义相反。
弱类型,偏向于容忍隐式类型转换,例如C语言的int可以变成double
VB、PHP、JavaScript 等就属于弱类型语言
例如:在vbscript中,可以将字符串 12 和整数 3 进行连接得到字符串 123,然后可以把它看成整数 123,而不需要显式转换。
弱类型有时显得很方便,有时却又极易出错。
比如:
var result=5 5; //two numbers
alert(result); //outputs '10'
var result=5 '5'; // a number and a string
alert(result); //outputs '55'
因此,使用弱类型语言也要格外注意数据类型,防止出错
在C#代码中,定义了一个整型变量后,就不能赋一个字符型数据给这个变量(除非你用强制类型转换)
弱类型就像javascript var 可以接受任何类型
强类型和弱类型之浅谈
任一门语言,不管是强类型还是弱类型,变量都有两个属性:类型和值;
也就是说,弱类型的变量同样有类型。变量,都既有类型,又有值。
1)强类型的变量类型,必须在源代码中明确定义,称之为“变量声明”,
2)弱类型的变量类型则是无需声明的,由解释器解释。
但是,这并不意味着,弱类型的变量就没有类型这一概念了,
举例来说,PHP的gettype()就是返回该变量“当前”的类型。
强类型的变量类型是不能改变的,弱类型变量是随需改变的,能够强制类型转换(内存对应的数据类型可改变),这是强弱的真正含义
强类型的变量一经声明,就只能存储这种类型的值,其他的值则必须通过转换之后才能付给该变量,有编译器自动理解的转换,也有由程序员明确指定的强制转换。但是,弱类型的变量类型则是随着需要不断转换,比如:
$a = 25; echo gettype($a); // integer $b = $a.'good'; echo gettype($a); // string
就会分别输出整数和字符串(貌似是integer,string,请自己测试)
强制转换并没有改变变量类型,强类型语言有个“强制转换”,这改变的是变量的值的类型,以便进行赋值,而没有改变变量的类型。强类型的变量类型是不允许改变的。强类型语言以Java为例,弱类型语言以PHP为例。
关于PHP中相等(==)和全等(===)的实现原理
除了String以外,PHP中的基础类型,他们的相等原理是不管类型,直接比较变量存储的二进制的值;PHP全等的原理,则是先比较解释器当前对变量解释的类型,然后比较其值。
动态静态语言、强类型弱类型
动态语言和静态语言
1. 动态类型语言:是指在运行期间才去做数据类型检查的语言。在用动态语言编程时,不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言;
>>> a = 1 >>> type(a) <type 'int'> >>> a = "s" >>> type(a) <type 'str'>
2. 静态类型语言:与动态类型语言刚好相反,它的数据类型检查发生在编译阶段,也就是说在写程序时要声明变量的数据类型。C/C++、C#、Java都是静态类型语言的典型代表。
Prelude> let a = "123" :: Int <interactive>:2:9: Couldn't match expected type `Int' with actual type `[Char]' In the expression: "123" :: Int In an equation for `a': a = "123" :: Int
强类型语言和弱类型语言
1. 强类型语言:使之强制数据类型定义的语言。没有强制类型转化前,不允许两种不同类型的变量相互操作。强类型定义语言是类型安全的语言,如Java、C# 和 Python,比如Java中“int i = 0.0;”是无法通过编译的;
>>> "123"+456 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
强类型语言在没有强制类型转化前,不允许两种不同类型的变量相互操作。
Java、C# 和 Python 等都是强类型语言。
2. 弱类型语言:数据类型可以被忽略的语言。与强类型语言相反, 一个变量可以赋不同数据类型的值,允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。C/C++、PHP都是弱类型语言,比如C 中“int i = 0.0;”是可以编译运行的;
> "123"+456 '123456'
弱类型语言允许将一块内存看做多种类型,比如直接将整型变量与字符变量相加。
C and C++ 是静态语言,也是弱类型语言;Perl and PHP 是动态语言,但也是弱类型语言。
强类型语言在速度上略逊色于弱类型语言,使用哪种语言还是要按需而定。
1)编写简单小应用,使用弱类型语言可节省很多代码量,有更高的开发效率。
2)对于构建大型项目,使用强类型语言可能会比使用弱类型更加规范可靠。
无类型: 汇编
弱类型、静态类型 : C/C++
弱类型、动态类型检查: Perl/PHP、JavaScript、VB
强类型、静态类型检查 :Java/C#,Scala
强类型、动态类型检查 :Python, Ruby,Scheme
静态显式类型 :Java/C
静态隐式类型 :Ocaml, Haskell
Python是强类型还是弱类型语言
Python 是强类型的动态脚本语言
好多人对python到底是强语言类型还是弱语言类型存在误解,其实,是否是强类型语言只需要一句话就可以判别,
强类型:不允许不同类型相加,例如:整形 + 字符串会报类型错误。
动态语言:不用显示数据类型声明,且在第一次给它赋值的时候确定其变量的类型。
脚本语言:一般是解释性语言,运行代码只需要一个解释器,不需要静态编译执行。
C/C++是强类型语言还是弱类型语言
C/C++在实际层面是弱类型的,也就是说内存上不限定类型。
但是,语法层面上,C/C++却是强类型的,因为一般字符串是不允许与整数型直接运算的
讨论的结果:C/C++应该是介于强类型和弱类型之间的语言
C/C++变量必须声明类型,字符串不允许与整型直接运算,这些是它强于那些弱类型语言的地方
但是,相对于Delphi、Java等这些强类型语言来说,它又比较“弱”,不支持泛型,如果要支持必须自己写。
比如 Delphi中的if语句,if a then.....,这里的a必须是布尔类型,
但是C/C++中,if后面可以是布尔型,也可以是整型,还可以是字符串
另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系!
参考推荐:
弱类型、强类型、动态类型、静态类型语言的区别是什么 (知乎)
标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2021-03-19 05:18:18
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: 强类型和弱类型的区别 (米扑博客)