gpt4 book ai didi

c - C样式语法的客观优势

转载 作者:行者123 更新时间:2023-12-01 14:24:09 24 4
gpt4 key购买 nike

有大量的编程语言受C样式语法(大括号,semicola等)的影响很大,可能比其他任何语法样式的影响更大。直到今天,许多现代,成功甚至是新发明的语言都使用这种语法-仅考虑Java,C++,C#,PHP,JavaScript,C,Perl等。

是否有客观原因可以解释此语法的广泛传播和成功?是否有其他语言的语法优势?

最佳答案

恕我直言,使C样式语法流行的唯一原因是大多数人都知道。因此,将C样式用于新语言可以应用旧的习惯(如命名约定)。这是一件好事!尽管我认为,语法是学习新语言最不关心的问题。但是良好的语法可以帮助避免错误。

微软做了很多努力使VB.NET与C#一样重要(记住MSDN中的所有“null(在Visual Basic中为Nothing)”,这让我很烦),但是C#仍然是.NET平台的主要语言。 。似乎VB.NET的前辈声誉不好。而且,使用C样式似乎会使外观更加专业。

毕竟,C的设计目标之一是使编译器易于实现。使用预处理程序要比为常量定义新的语言构造容易。或a [5]的语义。这不适用于很难实现的C++,部分原因是它试图保持与C的兼容性。

例子:

  • 区分大小写,尽管区分大小写对人类来说更自然(对于计算机而言不是)。这并不意味着您应使用与声明时不同的标识符拼写(请注意!),但是可能导致混淆。实际示例(Java):getWhiteSpace()或getWhitespace()?

  • 编辑:另一个不错的示例: What is the worst gotcha in C# or .NET?
    但是,当然,一旦习惯了它并在IDE的帮助下,这不再是什么大问题,有时甚至会变得更自然,因为它更像计算机的实际工作方式。
  • 运算符优先级
  • =用于分配,==用于比较。 if (a = b)有人吗?类似地,&&&|||(!~)在语法上过于接近,尽管它们含义不同。就个人而言,我更喜欢andor,因为符号应仅支持语法而不是主要部分。
  • ++--运算符;使某些语句短一些,但给表达式(a = b+++b++)带来了副作用。最初,编译器比i = i + 1更有效地进行编译。
  • for(init;condition;step)循环;尽管最佳实践是仅使用它来递增变量,但对此不存在显式语法。相反,此for结构是多余的,因为它(几乎)与
    init;
    while (condition) {
    statement;
    step;
    }
  • switch语句;曾经忘记休息吗?为什么不像大多数其他语言那样将范围用作大小写标签?
  • if(condition)语句。使用括号并不是一个好的选择,因为它可以在条件表达式本身中使用:
    if (!(var & 0x02))
  • 预处理程序
  • 大括号。这是有争议的。我不同意这样的论点,即它们“不占用很多屏幕空间”,更简洁或编写起来更快。首先,应将语言设计为易于阅读,而不易于编写。其次,根据您的样式,花括号使用的屏幕空间与关键字使用的屏幕空间完全相同:您将它们写在一行中。这不是很多浪费的空间吗?

    此外,人们批评LISP的括号混乱。从来没有发生过,您必须数一数大括号才能找出错过的地方吗?有时我会在右括号后面添加一条注释,以指示应该在此处结束的内容。 BASIC语法已包含此内容。并且甚至不需要与花括号一样的内容。
    我在某种程度上同意括号是好的:它们几乎是不可见的,并且缩进是主要的视觉特征。这样看来,python是下一步。
  • 分号用作语句终止符或分隔符。为什么单个分号是有效的语句?
    if (condition);
    DoSomething();
  • 不可区分的关键字序列
    public static string main()

    它是方法声明吗?还是变量声明?还是功能原型?或者是其他东西?例如,某些标点符号(以及每种声明类型的关键字)在这里可以帮助明确区分返回类型。这就是使C++难以解析的原因。
  • 正交性。 {} while (condition)确实适合语句后跟该块的其他语言构造。我认为VB的
    do [while/until condition]
    Statements
    loop [while/until condition]

    一个不错的解决方案,因为您有4种具有不同语义的可能组合:直到/同时在do / loop关键字之后。
  • 变量类型修饰符的奇怪顺序。
    int * const & i [];
  • 类型和变量名称仅紧接彼此出现,没有标记它是局部变量声明。 Scala使用val和var do来表示最后/可变变量的声明,并且类型之间用冒号分隔。在大多数其他方面,Scala使用Java语法。
  • 赋值运算符返回一个值;语句(带有效果)和表达式(仅返回值)之间没有区别

  • 编辑:这里有更多示例: https://stackoverflow.com/questions/163026/what-is-your-least-favorite-syntax-gotcha

    您当然不会在许多观点上达成共识,并且并非所有观点都一定是负面的(例如,分号),或者我知道一种适用于所有情况的解决方案。即使我愿意,最终的语言也不是完美的语言。编程语言将永远发展,新发明的语言有望从其前辈那里学习。那么,为什么不使用已知的语法而不是每十年设计一个新的语法呢?

    但是,当语言设计者可以避免只是键入错误的编程错误时,为什么不更改它呢?例如,这是在C#的switch语句中完成的,它使break(或goto)成为必需。一旦消除了最严重的弊端,大多数程序员知道其余语法语法的好处就远远超过了从头开始重新设计语言的好处。但是,令我如此惊讶的是,为什么这么多的程序员仍然如此急切地捍卫C语法,尽管这些习惯于计算机科学的进步,需要定期对几乎所有内容进行修订。

    总而言之,我认为C语法占主导地位的唯一原因是因为几乎所有专业程序员都知道C语法,而这些都是刚习惯的。尽管其他语言可能具有优势,但实际语法不太重要。这就是电气工程师按原样使用电荷约定的原因。

    (也许还会有关于程序员访问Dennis Ritchie的漫画:“请不要将switch语句的中断设为可选!”)

    关于c - C样式语法的客观优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/872233/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com