C错误: Expected expression before int

标签 c syntax-error conditional-statements variable-declaration

当我尝试以下代码时,我收到了提到的错误。

if(a==1)
  int b =10;

但是下面的语法是正确的

if(a==1)
{
   int b = 10;
}

这是为什么?

最佳答案

这实际上是一个相当有趣的问题。这并不像乍看起来那么简单。作为引用,我将基于 N1570 中定义的最新 C11 语言语法。

我猜问题的反直觉部分是:如果这是正确的 C:

if (a == 1) {
  int b = 10;
}

那么为什么这不是正确的 C 呢?

if (a == 1)
  int b = 10;

我的意思是,单行条件 if 语句无论带或不带大括号都应该没问题,对吗?

答案在于 C 标准定义的 if 语句的语法。我在下面引用了语法的相关部分。简而言之:int b = 10 行是一个声明,而不是语句,以及 if 的语法语句需要在正在测试的条件之后有一个语句。但如果您将声明括在大括号中,它就成为一个声明,一切都很好。

只是为了完整地回答这个问题——这与范围无关。该作用域内存在的 b 变量将无法从其外部访问,但程序在语法上仍然是正确的。严格来说,编译器不应该抛出错误。当然,无论如何,您应该使用 -Wall -Werror 进行构建;-)

(6.7) declaration:
            declaration-specifiers init-declarator-listopt ;
            static_assert-declaration

(6.7) init-declarator-list:
            init-declarator
            init-declarator-list , init-declarator

(6.7) init-declarator:
            declarator
            declarator = initializer

(6.8) statement:
            labeled-statement
            compound-statement
            expression-statement
            selection-statement
            iteration-statement
            jump-statement

(6.8.2) compound-statement:
            { block-item-listopt }

(6.8.4) selection-statement:
            if ( expression ) statement
            if ( expression ) statement else statement
            switch ( expression ) statement

关于C错误: Expected expression before int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46522371/

相关文章:

python-3.x - For/if 状态以一种方式工作,但不以另一种方式工作

C:multithreading-父线程在输出前退出

c - 如何通过 MPI_Send 发送整数数组?

c - pthread 和 ncurses - 为什么这个锁不起作用?

javascript - “Arc 不是构造函数”错误

python - 具有 bool 值和整数的数据框的 Pandas 条件子集

c - makefile:4: *** 缺少分隔符。停止

java - 为什么我编译时得到 "cannot find symbol"?

ruby-on-rails - Heroku语法错误;日志包含加扰的行号

scala - 我可以在 where 或过滤器中有条件吗?