百科问答小站 logo
百科问答小站 font logo



为什么很多新型编程语言都抛弃了 C 语言风格的 for 语句? 第1页

  

user avatar   xue-huang-41-78 网友的相关建议: 
      

典型的C风格for语句需要++运算符;如果要在C风格for循环内写较复杂的逻辑,还需要逗号运算符的支持。不少语言把它俩给ban了。


user avatar   haozhi-yang-41 网友的相关建议: 
      

foreach语法确实比单独的for要清晰明确。

当然foreach会损失一定的灵活性(例如说多个并列条件或者自定义步长等),但这些场景还是可以通过一定的语法糖来改善,实在太复杂的情况还有while来兜底……完全够用。

实际上c语言同时设计了for和while两个功能、场景、封装层次基本一样循环语法,确实就是有点多余的。

那么既然for和while重叠了,为了语法的清晰简洁,要砍掉一个的话,是砍掉while还是砍掉for,结论就非常显而易见了吧?


user avatar   levelpp_edu 网友的相关建议: 
      

在众多编程语言中间,C语言本来就是个异类~~

只是C太流行了,引得几大主流语言c++、java、c#都沿用了c的语法习惯。javascript之类的又模仿了java的语法,这些语言也叫类c语言,至少看上去和c语言类似。

所以,逻辑关系是:只有类C语言,才会采用C语言的for循环语法。

除此之外的语言一般都不用c语言的for语法,有些语言甚至都不用分号,想用for也不可能。


总之,不采用for语法才是编程语言的默认选项。采用c语言for写法的语言反而是少数派。


user avatar   huo-xing-zui-qiang-zhi-hui-guan 网友的相关建议: 
      

因为 for 循环的本质是 bounded loop,但它有更好的替代品(比如:foreach)。

for 循环也可以支持 unbounded loop,但这种情况应该用 while 。


user avatar   Ivony 网友的相关建议: 
      

因为C风格的for循环有太多不确定的地方,这些东西都非常的不直观:

典型的C风格的for循环像这样:


       for( initialize; condition; increment )   statement( block);     

那么存在这么一大堆问题:

  1. initialize声明的变量可见性范围是?生命周期是?
  2. condition在第一次循环结束后还是开始前判断?
  3. increment在第一次循环前执行还是第一次循环后执行?
  4. 循环结束后,是先执行increment还是先判断condition?
  5. initialize是否允许同时初始化多个变量?
  6. initialize和increment都可以省略,那么condition是否可以省略?省略后是不是等价于true?


这些问题的答案当然都是明确的,但都是完全不直观的。

人生苦短,没事记这些玩意儿干啥?


而反观while循环:

       while( condition )   statement( block);     

既没有initialize,也没有increment,所以这些问题都不存在:

  1. initialize声明的变量可见性范围是?生命周期是?
    没有initialize,所以不存在这个问题
  2. condition在第一次循环结束后还是开始前判断?
    condition放在statement前面,显然是在第一次循环开始前判断,要在第一次循环结束后判断可以用do...while。
  3. increment在第一次循环前执行还是第一次循环后执行?
    没有increment,所以这个问题不存在
  4. 循环结束后,是先执行increment还是先判断condition?
    因为没有increment,这个问题也不存在
  5. initialize是否允许同时初始化多个变量?
    因为没有initialize,这个问题也不存在
  6. initialize和increment都可以省略,那么condition是否可以省略?省略后是不是等价于true?
    condition显然不能被省略,其他俩压根儿没有。


PS:

statement( block) = statement or statement block,语句或语句块。



另外评论/答案中有人提到,for用分号分隔的三个部分都是语句,这是不对的,condition和increment部分是表达式而不是语句……



再补充一点好了,for循环不讨喜的很重要一个原因我觉得是上不上下不下。

论简洁,当然是while循环最简单,一看就懂,不需要额外的记忆。

如果限定在特定的遍历的场景下,for循环又不像foreach那样舒服,太多细节要自己处理。


唯一可圈可点的地方就是可以限制initialize里面declare的变量的可见范围和生命周期。

但是这又是for的另一个命门,因为只有一个statement,所以没法初始化不同类型的两个变量,或者在没有逗号表达式的语言里面做一些额外的初始化操作。

基本上除了个int i = 0也玩不出什么花,increment也是一样,除了i++、i--也很难做点别的事情。如果把要执行的东西放increment又很怪异。

这就是上不上下不下,看起来,很多细节暴露给你可以去处理,但实际用起来,这也用不了,那也用不了。最后发现只适合遍历。


更何况对于C/C++语言程序员来说increment很大程度上就是多余的:

       for( int i = 0; i++ < 10; )     

有时候觉得,搞个只有两个部分的的for循环更好用,increment除了可以在continue的时候被执行,其实直接写到循环尾部或者头部不一样么?



而新出的语言则直接用别的语法支持遍历,那for循环保留的意义就没了。


user avatar   d41d8c 网友的相关建议: 
      

不是“其他语言抛弃了 C 语言的 for 语句”,而是“C 语言抛弃了 Algol 60 的 for 语句,其他语言没有抛弃”。

Algol 60 的 for 语句一般长这样:

       for i := 1 step 1 until 10 do   outinteger(1, i);     

也可以长这样:

       for i := 2, 4, 6, 7, 8 do   outinteger(1, i);     

甚至可以混起来用。

这种“指定一个数值序列,让循环变量依次取序列中的每个数”的 for 循环才是原版的 for 循环。而 C 语言那种可以塞任意三个表达式的 for 语句是异类。

而这个异类比原版多的功能,就是更容易写出奇形怪状的代码了……


user avatar   axiomofchoice 网友的相关建议: 
      

我支持。因为匿名是网络环境差的万恶之源。


知乎做得好。与此同时,头条和抖音也上线了IP属地。


根据 @新浪财经 报道:

据悉,今日头条、抖音展示的帐号IP属地均为用户最近一个月内最后一次发文或评论时的网络位置,境内展示到省(直辖市、自治区、特别行政区),境外展示到国家(地区)。而且帐号IP属地以运营商提供信息为准,相关展示不支持手动开启或关闭。

在公告中,今日头条和抖音均提出,展示账号IP属地是为了维护真实有序的讨论氛围,减少冒充热点事件当事人、恶意造谣、蹭流量等不良行为。快手则表示是为了防止部分网友在热点事件中出现蹭流量、传播不实信息、冒充当事人等干扰正常讨论的行为。

实际上,在字节跳动和快手的产品上线该功能之前,微博已经于今年3月先行一步。3月17日,微博官方账号称,因发现个别冒充当地网友发布和传播不实信息的行为,微博将上线“用户个人资料页展示近期发帖所在地”的功能。

据悉,微博也是在个人主页中展示用户最近一个月内最后一次发布微博或评论的IP归属地,而且IP归属地显示规则与评论区此前显示规则保持一致,国内显示到省份/地区,国外显示到国家。


2、

几乎所有的网红产品,都是利用人性的七宗罪所达到的。


而匿名就是网络环境的万恶之源。


匿名,意味着一个人不需要对自己的言行负责,无论你是咒骂那个普通人去死,还是问候他的十八代祖宗。


在网络平台上,我们看过了太多这种悲剧。


为什么女权的“权”会被污名化成“拳头”的拳?


我个人是支持女权的。但是里面有人在故意把水搅浑。


为什么有人被人肉和网暴?


因为在屏幕面前可怕的那个他,不需要承担任何责任。甚至很多明星粉丝对普通人群起而攻之,所倚仗的,不过如此。


为什么微信上的环境要比微博等好得多?


因为微信是实名化的。喷他,意味着他可能能找到你的真实身份,如果他想的话。


当然,做人是需要互联网树洞的。在BBS这种场景下,所有人都可以匿名化。

而在如微博等社交平台上,我支持全面实名化。


但愿天下不再有网络暴力。




  

相关话题

  C语言中,stdio.h是最重要的头文件吗? 
  编程语言发展史上有哪些趣事? 
  请问数学的函数和编程语言的函数有什么区别呢? 
  只会c语言语法,就能强行做一个编译器出来吗? 
  都说VB.NET是旧语言,那为什么很多高校里面还在教非计算机专业的学生学VB呢? 
  是不是后置类型语言的函数一定要加关键字,不加关键字编译器识别不出吗? 
  为什么 2010 年前后诞生的语言(如 Golang, Rust, Swift)都是强类型 + 静态? 
  为什么程序员要使用三元运算符而不是显式写出 if 语句? 
  大括号不换行的坏处有什么?为什么有人不换行? 
  华为自研的「仓颉」编程语言,未来能取代java的地位吗? 

前一个讨论
如何看待网传原神充值 30w+ 的玩家上门寻求面试机会被直接拒之门外?
下一个讨论
如何看待不买东西就坐星巴克里的人?





© 2024-11-08 - tinynew.org. All Rights Reserved.
© 2024-11-08 - tinynew.org. 保留所有权利