C错误:int之前应为表达式

C错误:int之前应为表达式,c,syntax-error,conditional-statements,variable-declaration,C,Syntax Error,Conditional Statements,Variable Declaration,当我尝试下面的代码时,我得到了提到的错误 if(a==1) int b =10; 但是下面的语法是正确的 if(a==1) { int b = 10; } 这是为什么?{}--> 定义作用域,所以如果(a==1){intb=10;}说,您正在为{}这个作用域定义intb。为了 if(a==1) int b =10; 没有范围。您将无法在任何地方使用b 这实际上是一个相当有趣的问题。它并不像最初看起来那么简单。作为参考,我将以中定义的最新C11语言语法为基础 我猜问题的反直觉部

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

if(a==1)
  int b =10;
但是下面的语法是正确的

if(a==1)
{
   int b = 10;
}
这是为什么?

{}
-->

定义作用域,所以
如果(a==1){intb=10;}
说,您正在为{}这个作用域定义intb。为了

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

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

这实际上是一个相当有趣的问题。它并不像最初看起来那么简单。作为参考,我将以中定义的最新C11语言语法为基础

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

if (a == 1) {
  int b = 10;
}
那么为什么这不是正确的C

if (a == 1)
  int b = 10;
我的意思是,一行有条件的
if
语句应该可以使用大括号还是不使用大括号,对吗

答案在于C标准定义的
if
语句的语法。下面我引用了语法的相关部分。简而言之:
intb=10
行是一个声明,而不是一个语句,
if
语句的语法要求在测试的条件之后有一个语句。但是如果你把声明用大括号括起来,它就变成了一个声明,一切都很好

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

(6.7)声明: 声明规范初始化声明器listopt; 静态断言声明 (6.7)初始声明器列表: 初始化声明器 初始化声明器列表,初始化声明器 (6.7)初始声明器: 声明人 声明符=初始值设定项 (6.8)声明: 标记语句 复合语句 表达式语句 选择语句 迭代语句 跳转语句 (6.8.2)复合报表: {块项目列表选项} (6.8.4)选择声明: if(表达式)语句 if(expression)语句else语句 switch(expression)语句
通过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
}

张贴你的错误。你的代码很好用,除非你在范围外访问“b”。我在标题中提到了这个错误。而且,即使B没有被使用在代码中的任何地方,错误仍然存在。而且,C和C++之间有一些差异,这最好通过直接访问文档来解决。查看我的wrt
while
循环,在该循环中我遇到了相同的编译错误。谢谢,我现在已经找到了。@MsPillai欢迎您。所以,若问题解决了,你们可以接受答案。看起来这和范围无关。请检查@sheu的答案。一个块定义了变量的生命范围,其中“它只是一个语句”——实际上,它是一个声明。声明在那里是合法的。<代码>如果必须遵循一个语句,但是括号封闭的声明和语句列表作为一个语句。此外,C和C++之间有一些差异,这是最好直接通过文档来解决的。查看我的wrt
while
循环,在该循环中我遇到了相同的编译错误。此答案中的错误与您的答案中的错误并不完全相同。这个答案涉及控制流语句的主体(if(expression)语句的语句部分),而您的答案涉及其控制表达式。在这个答案的情况下,C和C++语法是相同的。