代码之家  ›  专栏  ›  技术社区  ›  SysAdmin

C++中的分号?

c c++
  •  23
  • SysAdmin  · 技术社区  · 16 年前

    是否确实需要“缺少分号”错误?为什么不把它当作警告呢?

    当我编译这个代码时

    int f = 1
    int h=2;
    

    编译器会智能地告诉我哪里缺少它。但对我来说,这就像-“如果你知道它,就把它当作它在那里,然后继续。(稍后我可以修复警告。)

      int sdf = 1, df=2;
      sdf=1 df =2
    

    即使对于这个代码,它的行为也是一样的。也就是说,即使多个语句(不带;)在同一行中,编译器也知道。

    那么,为什么不取消这个要求呢?为什么不表现得像 Python , Visual Basic 等。

    讨论摘要

    缺少两个示例/实例,而分号实际上会导致问题。

    1。

    return
     (a+b)
    

    这是JavaScript最糟糕的方面之一。但是,在这个场景中,分号插入是JavaScript的问题,但不是 对于C++。在C++中,如果 ; 返回后插入。也就是说,缺少返回值。

    二

    int *y;
    int f = 1
    *y = 2;
    

    对于这一点,我想没有比引入as语句分隔符更好的方法了,也就是说,a 分号 .

    9 回复  |  直到 11 年前
        1
  •  29
  •   Jason Williams    16 年前

    在很多情况下需要分号。

    如果你有:

    int *y;
    int f = 1
    *y = 2;
    

    这将被解析为

    int *y;
    int f = 1 * y = 2;
    

    因此,如果没有分号,它是不明确的。

        2
  •  55
  •   Delan Azabani    16 年前

    它是 非常 很好,C++编译器不这么做。其中一个 最差的 javascript的各个方面是分号插入。想象一下:

    return
      (a + b);
    

    C++编译器将愉快地继续在下一行中,正如一个预期的那样,“插入”分号(如JavaScript)的语言会把它当作“返回”,而忽略“(A+B)”。

    不要依赖于编译器错误修复,而要养成使用分号的习惯。

        3
  •  8
  •   Pete Schlette    16 年前

    首先,这只是一个小例子;您确定编译器能够智能地告诉您对于更复杂的代码有什么问题吗?为了 任何 一段代码?所有编译器都能以同样的方式智能地识别这一点,这样就可以保证一块C++代码有丢失的分号吗?

    第二,C++是十多年前创建的,那时计算资源并不像现在这样。即使在今天,构建也需要相当长的时间。分号有助于清楚地划分不同的命令(对于用户和编译器!)并帮助程序员和编译器理解正在发生的事情。

        4
  •  4
  •   Himadri    16 年前

    ; 是为了程序员的方便。如果代码行很长,那么我们可以按Enter键并转到第二行,因为 ; 用于行分隔符。这是编程约定。必须有行分隔符。

        5
  •  3
  •   Konrad Rudolph    16 年前

    使用分号(或换行符,选择一个)可以使编译器简单得多,错误消息更易读。

    但与其他人所说的相反,两种形式的定界符(作为 绝对的 )是绝对必要的。

    例如,假设haskell也没有。即使是当前版本的vb也允许在语句中的许多地方换行,就像python一样。这两种方法都不需要在许多地方进行线路延续。

    例如,vb现在允许使用以下代码:

    Dim result = From element in collection
                 Where element < threshold
                 Select element
    

    没有语句分隔符,没有行继续符,但是没有任何含糊不清的地方。

    从理论上讲,这可能会进一步推动。 所有 通过引入一些规则,可以消除歧义(同样,看看haskell)。但同样,这使得解析器更加复杂(它必须在很多地方对上下文敏感,例如 return 例如,如果不首先知道函数的返回类型,就无法解决这个问题)。同样,它使输出有意义的诊断变得更加困难,因为错误的换行符可能意味着一些事情中的任何一件,所以编译器无法知道。 哪个错误 用户已经做了,甚至没有 在哪里? 出错了。

        6
  •  2
  •   Bozhidar Batsov    16 年前

    在C程序中,分号是语句终止符,而不是分隔符。你可能想读 this fun article .

        7
  •  0
  •   ChrisBD    16 年前

    +给你们两个。

    分号是命令行分隔符,与VB、Python等C和C++不同,在代码行中忽略空格,包括回车符!这最初是因为C计算机监视器的启动只能处理80个字符的字符,而C++是基于C规范的。

    我可以提出这样一个问题:“当我尝试在几行代码上写代码时,为什么我必须不断地得到关于vb中缺少字符的错误,当然如果vb知道这个问题,它可以插入它?”

    正如已经指出的那样,自动插入可能是一场噩梦,特别是在包装到第二行的代码上。

        8
  •  0
  •   Matthieu M.    16 年前

    我不会扩展对分号和换行符的需求,两者都有优点和缺点,最后它是一个简单的语言设计选择(即使它影响到所有用户)。

    我更担心编译器的建议 修理 代码。

    如果你曾经见过一个神奇的工具(比如…嗯,我们来接一个 merge 工具)以及它的自动化工作方式,您会非常高兴编译器没有修改代码。最终,如果编译器知道如何修复代码,那么这意味着它知道您的意图,并且思想传输还没有实现。

    至于 警告 ?任何一个值得注意的程序员都知道警告应该被视为错误(编译停止了),那么有什么好处呢?

        9
  •  0
  •   visitor    16 年前
    int sdf = 1,df=2;
    sdf=1 df =2
    

    我认为一般的问题是,如果没有分号,就不知道程序员实际上可能是什么意思(例如,第二行可能是 sdf = 1 + df - 2; 严重的打字错误)。这种情况很可能是完全任意的打字错误造成的,并且具有任何预期的含义,因此,让编译器静默地“纠正”错误可能根本不是一个好主意。

    您可能还注意到,您经常会得到“预期分号”,其中真正的问题不是缺少分号,而是完全不同的内容。想象一下一个格式错误的表达式,编译器可以通过静默地执行和插入分号来理解它。

    分号似乎是多余的,但对于程序员来说,这是确认“是的,这是我的意图”的简单方法。

    另外,警告而不是编译器错误太弱。人们编译代码时会关闭警告,忽略收到的警告,而afaik标准从未规定编译器必须警告什么。