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++之间有一些差异,这是最好直接通过文档来解决的。查看我的wrtwhile
循环,在该循环中我遇到了相同的编译错误。此答案中的错误与您的答案中的错误并不完全相同。这个答案涉及控制流语句的主体(if(expression)语句的语句部分),而您的答案涉及其控制表达式。在这个答案的情况下,C和C++语法是相同的。