为什么说C是弱类型的语言,C++是强类型?

zhbruce 2002-08-09 02:31:54
为什么说C是弱类型的语言,C++是强类型?
如何区别强弱类型!
...全文
757 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
prototype 2002-08-11
  • 打赏
  • 举报
回复
thanks, anrxhzh(百宝箱) ,

that is a clean explanation, and i agree.

actually, the thing that i don't agree in your previous posts (you might not agree either if you think it over) is the claim: c++ 却容忍了将NULL隐式地转换为整型, 这一违反类型系统的转换. because, as you may have noticed from your explanation, for expressions like 'int i = null;', there is no implicit conversion, actually no conversion at all, not to mention whether there is type-conversion violation or not.
zhaobong 2002-08-10
  • 打赏
  • 举报
回复
主要就是C++的类型检查比C要求严格。
chinaeagle 2002-08-10
  • 打赏
  • 举报
回复
type safety是c++的一个重要特点~
bailingke 2002-08-10
  • 打赏
  • 举报
回复
原来如此。领教了!
prototype 2002-08-10
  • 打赏
  • 举报
回复
> 那就是C禁止将NULL隐式地转换为整型,
> 而C++却容忍了这一违反类型系统的转换

how does c++ 却容忍了将NULL隐式地转换为整型?
anrxhzh 2002-08-10
  • 打赏
  • 举报
回复
prototype:

这是标准中NULL的定义:
#define NULL <either 0, 0L, or (void *)0> [0 in C++]
为什么要如此定义呢,请看:

int n = NULL;[1]
int* p = NULL;[2]

在C中,NULL的类型是void*,所以[1]是不合法的,不能将指针类型隐式地转换为整型;[2]是合法的,可以将void*隐式地转换为任意的指针类型。

在C++中,由于禁止隐式地将void*转换为其它的指针类型,所以为了使得[2]合法,将NULL的类型改为了整型,但是这样一来,却使[1]也合法化了,这是一个副作用。斷指以存腕,利之中取大,害之中取小也。害之中取小,非取害也,取利也。
kwok_1980 2002-08-09
  • 打赏
  • 举报
回复
C++的类型检查系统比较强大
而且全面!在安全性方面做得不错!
zhouzicn 2002-08-09
  • 打赏
  • 举报
回复
是说类型检查的强弱不同吧
anrxhzh 2002-08-09
  • 打赏
  • 举报
回复
有趣的是,正是由于C++禁止将void*隐式地转换为其他的指针类型,反而造成了罕见的C比C++更安全的一例,那就是C禁止将NULL隐式地转换为整型,而C++却容忍了这一违反类型系统的转换。这一古怪现象的深层次原因是我们的计算机体系本质上只能理解0和1,“空”对它来讲过于深奥了。

anrxhzh 2002-08-09
  • 打赏
  • 举报
回复
孤立地判定一个语言是弱类型还是强类型是没有意义的,因为在学术界还没有"strongly typed language"的统一的定义。我们只能说语言A相对于语言B是强类型的。笼统地将,强类型语言是能够禁止任何违反类型系统的代码的语言,或者说是能够捕获所有违反类型系统的错误的语言。我们说C++相对于C是强类型的,是因为C++禁止了一些C中的隐式转换,比如将void*转换为任意的指针类型。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧