先说明下编程语言的动态性和静态性,静态性语言指的是,在编译时,为变量开辟指定内存空间,直观的形式表达,就是必须要为变量指定类型,例如c/c++,c#,java等,为变量指明类型,编译器在编译的时候,就按照类型开辟内存空间,然后将此空间与变量名关联。动态语言,指的是在变量声明的时候,并不指定类型,而是只建立一张映射表,变量的开辟内存的时间,是在运行时候,第一次被赋值后,根据被赋的值开辟的内存大小,直观的形式便是在编写代码时,并不给变量指定类型,例如脚本类语言php,python,perl,以及javascript,变量真正获得内存空间的时机,是在第一次被赋值时。
注意一下代码:
int say(char *str){
printf("%s\n", str);
return strlen(str);
}
int main(void){
char *str = "hello world";
say(str);
}
对比下php:
function say($str){
print "say: "$str."\n";
return strlen($str);
}
$str = "hello world";
say($str);
c代码中,变量需要预先被声明类型,java与c#沿袭了这个特点,在编译过程中,就已经将内存申请给了变量str,开辟内存的大小依据声明的类型而定。
php的代码中,变量的内存,直到开始运行,才江南字符串的首地址赋予了变量$str,变量的内存大小,依据第一次赋值情况而定。
下面谈下弱类型与强类型,这 其中有个很容易误解的地方,就是以为动态语言都是弱类型,静态语言都是强类型,这种误解的根源,是没理解语言的强弱的真正含义。
所谓强类型,指的是变量的类型确定后,如果要改变变量的类型,自身并不会自动进行转型,必须强制进行转换。(java的子类对父类的可以自动上转型,但必须强制下转型,是因为子类为父类的扩充,或者说父类是子类的子集,子类本身就囊括了父类的属性。)如果要改变变量的类型,通行规则是在变量赋值前,用(新类型)予以改变,如整形与浮点型间的互换,整形与字符类型的强制转型。
而弱类型,是指变量的类型会根据环境需要进行自动转换,不需要强制对其进行转换申明。比如在php中
$x = "3";
$y = $x+5;
print $y."\n";
var_dump($x);
var_dump($y);
输出:
8
string(1) "3"
int(8)
输出结果为8,这其中并没有对$x进行强制转义,但$x在运行时根据需要自动为整形,随后又恢复原有类型。
值得注意的是c归于为弱类型,是因为在进行数值运算时,会自动进行整形与浮点型间的转型,而java在进行数值运算时,则必须强制转型。
虽然以上分析看起来有点流于理论派,但这些基础的观念如果不理解明白,以后在遇到具体问题时,会因基础的缺乏而不知所言。
php的字符串其实是一个字符类型的数组,php没有字符类型,但可以用数组长度为1的字符串表示。
与java字符串的区别:为了Java的纯面向对象特性,甚至将所有的基本类型都有对应的对象形式存在,字符串可以转型为String类型,构成对象形式,但php的字符串,就没有如此纯粹的面向对象的处理方式。
与c字符串的区别:c对于字符的处理是相当底层的,如果按照整形打印一个字符,会打印出对应的ASCII码,所以在处理方式上,也是以单个字符为基础。字符串是以\0(是零,不是字符O!),也就是NULL作为分隔符和结尾符,在输出时,遇到\0,则会认为字符串已经到达结尾处,从而停止输出,在字符串的末尾,会自动添加一个\0的空字符作为结尾标识。php中的字符串,遇到\0也同样会停止,但在结尾,却不会添加\0。所以同样的字符串,php的长度比c要少一,便是最后的\0。
#include
#include
int main(){
unsigned int a=20;
signed int b=-130;
char x = a>b?'a':'b';
printf("%c\n", x);
}