为什么在C / C ++中允许使用分号?

时间:2015-09-07 10:52:06

标签: c++ c parsing language-lawyer

为什么C / C ++解析器在单独使用分号时不报告分号错误?例如:

int a;
;
int b;

它是语言语法规则的结果还是解析算法的结果?标准对这种情况有何看法?是;还是例如应该允许int;

3 个答案:

答案 0 :(得分:1)

分号终止声明。

如果你的陈述没有做任何事情,那就是你作为程序员的特权。

完全有效使用空状态的示例:

 for (int x = 0;; x++) {
     if (something(x)) {
         return 5;
     }
     if (bah(x)) {
         continue;
     }
     if (otherthing(x)) {
         return 3;
     }
 }

for循环中的中间语句为空。但它仍然是必要的,因为for循环有三个不同的语句,第一个和第三个被填充。

我认为没有一个很好的理由说明单独的分号应该是无效的;它没有害处。它是所有相关的C / C ++标准所允许的,这不是一个比不被允许的更糟糕的位置。

答案 1 :(得分:1)

考虑K& R的经典字符串复制功能:

void strcpy(char *src, char *dst)
{
    while (*src++ = *dst++);
}

正如您所看到的那样,空语句不仅仅是合法的,它还是短C语法的基础之一。

答案 2 :(得分:0)

标准中指定了§6/ 1 §6.2/ 1 (修订版N3376):

  

语句:

     

...

     

attribute-specifier-seq_opt表达式语句

     

...

  

表达式语句:

     

expression_opt;

所以语句可以是一个带有冒号的表达式语句,也可以是一个表达式和一个属性说明符序列。