网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
11月09日漏签0天
c语言吧 关注:801,037贴子:4,370,648
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 首页 上一页 1 2 3 下一页 尾页
  • 65回复贴,共3页
  • ,跳到 页  
<<返回c语言吧
>0< 加载中...

回复:为什么 C 是弱类型语言 JAVA 却是强类型语言?

  • 只看楼主
  • 收藏

  • 回复
  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
C语言中你能让,"Hello"+123 这样的表达式运行?而PHP和JavaScript不认为它们是不同的数据类型,所以"Hello"+123 ="Hello123"。。。
PHP和JavaScript设计原理就是考虑去掉数据类型,至少是不刻意强调数据类型,(当然,底层是区分的,毕竟这俩底层就是C语言或C++实现的解释器)。。。


  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
PHP的变量并不是依据上下文,而是很直接的:你给什么就是什么。。。
因为我最近在参考JavaScript和PHP写一门专门用于单片机的脚本语言解释器,所以我的脚本语言是借鉴了PHP的变量手法,你给变量什么它就是什么,不存在变量声明。。。同样尽量去掉数据类型,对象,数组,数字,字符串都能进行互相的四则运算,逻辑运算及比较运算


2025-11-09 02:58:46
广告
不感兴趣
开通SVIP免广告
  • 射命丸文
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我觉得只有有类型和无类型之分,c/c++对类型要求很严格的,所谓的int能赋值给double,也只是编译器帮你做了强制转换,隐式转换和你自己转换的区别就是一个是编译器做一个是你做,不能这样就说说弱类型。c++如果你函数参数是string,传一个const char*进去,编译器就会帮你调构造函数构造一个string,但这并不能说明c++可以把const char*赋给string类型的变量,只是调用了定义好的函数转的。但是js却完全可以直接赋值甚至可以整形给字符串,虽然到最后底层实现也是要转的,只是这些转换的事都交给计算机做了。你先a="你好",然后a=5,计算机只不过是把原来的那块内存扔掉,重新分配一个整形空间,然后存上5,取名为a而已,你还真以为在计算机里能够整形给字符串吗?


  • 那年今日像二哈
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
首先我查了一下什么是数据类型,然后类型检查什么意思,结论就是: 没看懂。我只能按照我浅显的理解,认为这个数据类型就是大家平常理解的数据类型。然后类型的概念有些标记在变量上,有些标记在了值上面。你说的无类型意思应该是说标记在值上面的意思吧,变量只是个引用。再有就是变量声明我感觉你好像有点搞混,似乎 String var = "123",这样才叫变量声明。var = "123",算是没有声明?但是类型这个写法完全可以省略,可以通过引号判断。我也没说php是依据上下文的。


  • 那年今日像二哈
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@pengzhenxx


  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这样的理解太小白了。。。比如123==“123”,一个字符串和一个整数做运算,对于C语言这样有数据类型的语言而言是决不允许发生的。。。而PHP和JavaScript这样的无数据类型语言却可以,因为他没有数据类型。。。
变量声明,PHP中就是没有的,也可以叫变量赋值时同时声明。。。PHP中$var=“123”;这一,$var=123;也可以,$var=[1,2,3];也可以,完全没有类型声明,也不是隐藏掉了类型,它就没有类型关键字


  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不要纠结于变量,变量对于PHP和JavaScript这样的无数据类型的语言而言,对于底层实现而言就是个链表上的节点,这个节只是包含变量名,变量的值,变量的值中才包含值的类型(底层必须区分类型,毕竟是C语言实现,至少我是这么实现的),但是这是底层的工作,对于PHP和JavaScript语言本身而言,你是察觉不到数据类型的,它们也没有数据类型。。。
就像C语言的int+double,底层的编译器会将int转化为double,但是C语言本身int+double是可以直接进行的,你察觉不到是两个不同类型发生了运算。。。所以我说了,C语言算什么,这个看和什么语言比,你却扛起来了


  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
有数据类型的语言是决不允许不同的数据类型做相互运算的,从这点看,C语言确实不算是那么强的强数据类型语言,毕竟有个int+double之类的。。。
但是C语言又不像PHP,JavaScript那样随意运算,因为JS和php没有数据类型,所有都一样当然可以随意晕啦。。。所以我说看和什么语言比。。。
为了堵住,不要说C++的运算符重载,C++的确可以通过运算符重载实现123=="123" , "Hello"+123之类的表达式,,但是这是通过运算符重载实现的,C++本身作为有数据类型的语言是决不允许直接让123=="123"之列的表达式成立的


2025-11-09 02:52:46
广告
不感兴趣
开通SVIP免广告
  • 那年今日像二哈
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我能理解你说的什么意思,只是很不习惯你把变量没有类型称为无类型。你自己也说了,变量的值包含了类型,既然如此,那怎么能说无类型。你一直拿 123, "123" 作比较举例子,按照一般语言实现,这两个很明显具体值不一样,值里面存储的"类型标记"也不一样,放在一起处理很明显是经过类型转换的,处理的时候解释器或者编译器都是清清楚楚的。你形容的好像解释器把这看成一坨东西,很神奇的和另一坨东西比较,如果相等,那就相等了。


  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我晕,我要给你看看,无数据类型的变量值是怎么实现的。。。
无数据类型的所有类型都是一个类型,占用完全一样的内存大小,这是和有数据类型的语言完全不一样的。。。而且这是底层实现,体现在高层语言上就是无数据类型
这是无数据类型的变量值实现

无类型的语言,所有类型都是这一个类型:IOT_Value,至少我是这么实现。。。sizeof(IOT_Value)是同样的大小。。。。
而有数据类型的int double等会占用不同的内存大小


  • pengzhenxx
  • 麻婆豆腐
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
而且不要把底层实现,放到上层语言中,去说IOT_Value中也是有类型的,毕竟这是C语言的底层实现,上层脚本能看到的只是IOT_Value这个东西,所以上层脚本语言IOT_Value可以是整数,可以是实数,可以是数组,可以是字符串,可以是对象,可以是一切类型,所以也是无数据类型的由来。。。。


  • 那年今日像二哈
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不想多废话了


  • 那年今日像二哈
  • 超能力者
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@pengzhenxx
下午用的手机, 打字相当累, 有什么明显错误还望大佬明示, 小弟在此跪谢了


  • 幻の上帝
  • 葱の帝球
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
> 只是很不习惯你把变量没有类型称为无类型
不是习惯不习惯的问题,不管从历史还是现实,这就是错的。
虽然少数人如 Robert Harper 之流是也有这种意见,认为所谓 dynamic typed = untyped = unityped ,但是这种意见从来不是主流观点。
这种观点的错误在于同时漠视研究传统和现实: PL 中所谓的类型本来就不限于对象语言的类型,所有 typing rule 中出现的 term 上特定位置的 annotation (具体由元语言的文法决定)都是 type (而不只是他家 ML 所谓的“静态”类型);否则,所有非静态的类型检查检查的是什么玩意儿?
鼓吹静态类型才算类型的,大概都不知道“静态”这玩意儿究竟是怎么来的以及怎么在一个语言的对应理论中其作用的。至于像 Robert Harper 这种明知 phase 还要恶意混淆分析类型关联的作用(effect) 的对象语言和元语言来误导人,是要遭天谴的。


2025-11-09 02:46:46
广告
不感兴趣
开通SVIP免广告
  • 幻の上帝
  • 葱の帝球
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
关于什么算是 PL 中的类型,我另外举几个跟这吧主题比较相关的例子。
在 ISO C 中, lvalueness 在 spec 的意义上是一种和 type 无关的 semantic property (同时在特定的上下文中因为在 Constraint 出现,为实现其检查可以弱化为 syntactic property ),但这并不妨碍一个和 ISO C 等价的形式语义把 lvalueness 通盘当作 type 来处理,就算它不是 ISO C 定义的 type 。类似地, ISO C++ 的 value category 以及 Rust 的 placement/value 的划分也具有相同的特征。
理由是,这些特性完美地符合静态类型需要的“类型”的普遍要求: statc & following terms 。
而且,一定程度上讲,就算强行只管静态类型,C 的 lvalueness 和 C++ 的 value category 是比这些语言的 spec 中明确定义的所谓 type 更有资格作为类型的 PL 意义上的类型。
实际上, C 和 C++ 的所谓 type 比上述的类型更复杂。例如 ISO C99 开始为了补全之前语义漏洞明确的 effective type ,以及 C++ 所谓的 dynamic type ,这些都不是“静态”的类型(反正 Robert Harper 看来无视这些了)。而反过来,lvalueness 和 value category 是要求在 translation phase 7 之前确定而彻底静态的。
当然,这不表示不能把这些东西搞成 latent 的。我的语言实现里就包含了这些东西(虽然我不想引入这些破烂但是要排除 GC 又不想搞更屑的 refinement type 之类,原则上无法避免),最近加上了类似 rvalue reference 而让类似 std::forward 的屑更麻烦了……因为类似 C++ 的 decltype() 和 decltype(()) ,实际上 object type 和 expression type 是两回事——而后者才是传统静态类型鼓吹者所谓的静态类型的来源。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 首页 上一页 1 2 3 下一页 尾页
  • 65回复贴,共3页
  • ,跳到 页  
<<返回c语言吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示