代码之家  ›  专栏  ›  技术社区  ›  Matt Sherman

为什么C要求条件值周围的parens?

  •  6
  • Matt Sherman  · 技术社区  · 15 年前

    我刚刚读了一个关于python的so问题,注意到for循环中缺少括号。我看起来很好,然后我想知道:为什么C需要他们?

    例如,我现在需要写:

    if (thing == stuff) {
    }
    

    foreach (var beyonce in allthesingleladies) {
    }
    

    所以我想知道为什么我不能写:

    if thing == stuff {
    }
    

    我不知道那句话中是否有语法上的歧义?

    有趣的是,对于一个衬板,支架可以是可选的:

    if (thing == stuff)
      dostuff();
    
    6 回复  |  直到 15 年前
        1
  •  8
  •   Gabe Timothy Khouri    15 年前

    系统需要某种方法来知道条件何时停止,语句何时启动。这意味着要么围绕条件进行parens是可选的, 语句周围的大括号是可选的。C的设计者选择使大括号成为可选的(如果只有一条语句)。

    考虑一下:

    if x == 12 - x == 3 ? x++ : x--;
    

    语法分析器 能够 可以判断条件的结束位置和语句的开始位置,但需要括号可以使其更简单。在我的例子中,语法表明完整的语句是 if (x == 12) { -x == 3 ? x++ : x--; } . 但是,你不知道 - 是语句的开头,直到第二个 == ,其中已包含3个令牌。

    由于正确解析这些示例需要在输入流中查找前面任意数量的标记(而且它可能会使代码更难被人类读取),因此有一个很好的理由需要parens。

        2
  •  4
  •   Henk Holterman    15 年前

    它是一个语法“特性”,可以追溯到C语言,也可以追溯到之前的某些语言。

    从本质上说,这是一种选择

    if (condition) statement;
    

    if condition then statement;
    

    在构思C的时候,更短的符号和更少的关键字是趋势。

        3
  •  2
  •   Alex Essilfie    15 年前

    [我知道我很可能为此激怒她,但我还是要说出来]

    作为一个以VB为主的程序员,有一件事让我非常恼火。在我看来,parens应该是可选的,括号是强制的。如果要求太多,那么微软可以通过引入一个相当于VB的C语言,从VB“借”到C语言中。

    但是为什么要麻烦呢?微软设计了基于C、C++和Java的C语言,所有这些都把if条件放在父母中,为什么C应该不同呢?


    编辑

    老实说,我认为基于C 4对可选参数和命名参数的采用,一个始终在VB中的特性(至少从VB6开始),C(即C 5.0)的下一个版本也可以引入一个“新”特性,这样您就不必键入不必要的括号。

    因为有三元 if condition ? truePart : falsePart ,拥有 if condition then something 或者对于那些不喜欢C看起来像VB的人来说, if condition do something 这主意不错。

        4
  •  0
  •   Just another metaprogrammer    15 年前

    这是一种来自Java的语言设计选择,它又来自C++,而C又来自C,而C又来自于C语言。???

    Python不需要支撑条,因为缩进显示了它的意图。F也一样。这是个好主意。

        5
  •  0
  •   supercat    15 年前

    顺便说一句,如果我有我的鼓,我会允许一个操作人员在帕伦斯以外:一个领先的感叹号。与复杂的正条件的代码测试相比,复杂的负条件的代码测试最终会得到一组额外的括号,这让我很恼火。

        6
  •  0
  •   AMissico    15 年前

    简单地说,这是由于C/C++/C如何处理空白。您需要某种分隔符,因为语句可以跨多行。您还需要一种方法将语句“阻塞”或分组到一个块中。

    • C/C++/C*u]使用(),{}
    • vb/vb.net/vbscript/vba使用 功能/结束功能,子/结束子, if/then/else/else if/end if和so 在。(仅用于阻塞,因为基于VB的语言不支持跨多行的语句。)

    如果您的特定问题,则使用()创建表达式。因此,您需要一种方法来告诉编译器您已经完成了表达式的操作,因为不需要(阻塞分隔符)。