【问题标题】:C error: Expected expression before intC 错误:int 之前的预期表达式
【发布时间】:2014-04-20 14:48:57
【问题描述】:

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

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

但以下在语法上是正确的

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

这是为什么?

【问题讨论】:

  • 发布您的错误。除非您访问超出范围的“b”,否则您的代码可以继续使用。
  • 我已经在标题中提到了错误。此外,即使 b 没有在代码中的其他任何地方使用,错误仍然会出现。
  • 此外,C 和 C++ 之间存在一些差异,最好直接访问文档来解决。查看我的answer wrt while 循环,我在其中遇到了相同的编译错误。

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


【解决方案1】:

这实际上是一个相当有趣的问题。它并不像最初看起来那么简单。作为参考,我将以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-specifiers init-declarator-listopt;
            static_assert-declaration

(6.7) init-declarator-list初始化声明器
            init-declarator-list , init-declarator

(6.7) 初始化声明器声明符
            声明器 = 初始化器

(6.8) 声明标签声明
            复合语句
            表达式语句
            选择声明
            迭代语句
            跳转语句

(6.8.2) 复合语句{ block-item-listopt}

(6.8.4) 选择语句if ( 表达式 ) 语句
            if ( 表达式 ) 语句 else 语句
            switch ( 表达式 ) 语句

【讨论】:

  • 另外,C 和 C++ 之间存在一些差异,最好直接访问文档来解决。查看我的answer wrt while 循环,我在其中遇到了相同的编译错误。
  • 这个答案的错误和你的错误并不完全相同。这个答案处理控制流语句的主体(if ( expression ) statementstatement 部分),而你的处理它的控制 expression。在这个答案的情况下,C 和 C++ 语法是相同的。
【解决方案2】:

在 C89 中,变量只能定义在块的顶部。

if (a == 1)
    int b = 10;   // it's just a statement, syntacitially error 

if (a == 1)
{                  // refer to the beginning of a local block 
    int b = 10;    // at the top of the local block, syntacitially correct
}                  // refer to the end of a local block

if (a == 1)
{
    func();
    int b = 10;    // not at the top of the local block, syntacitially error, I guess
}

【讨论】:

  • 一个块定义了一个变量的生命范围。
  • “这只是一个声明”——实际上,它是一个声明。在那里发表声明是合法的。 if 后面必须跟一个语句,但是用大括号括起来的声明和语句列表算作一个语句。
【解决方案3】:

{ } -->

定义范围,所以if(a==1) { int b = 10; } 说,您正在为 {}- 这个范围定义 int b。对于

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

没有范围。而且您将无法在任何地方使用b

【讨论】:

  • 谢谢,我知道了。
  • @MsPillai 欢迎。因此,如果问题得到解决,您可以接受答案。
  • 似乎与范围无关。请检查@sheu 的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
相关资源
最近更新 更多