在if语句中单独声明?

时间:2017-02-21 02:25:24

标签: c language-lawyer declaration

我不明白为什么会这样:

if(1)
{
    int i;
}

而这不是:

if(1) 
    int i;
  

错误:int之前的预期表达式

如果您可以提供一些标准参考。

5 个答案:

答案 0 :(得分:7)

在C语言中,声明只能作为复合语句的一部分出现,而不能作为任何其他语句的一部分出现(参见C11 6.8和6.8)。 2)。

答案 1 :(得分:4)

声明必须是块项 1 的一部分。

block-item-list包含一个块项 2

并且block-item-list只能在括号内,作为复合语句 3 的一部分。

这与C ++不同,因为声明中包含声明语句(前者允许通过块语句定义变量)。

(引自ISO / IEC 9899:201x 6.8.2复合声明1)

1 块项:
声明

2 块项目列表:
块项目
block-item-list block-item

3 复合语句:
{block-item-list opt}

答案 2 :(得分:4)

这是由于C语法。具体而言,if语句定义为:

  

if( expression statement

根据C11 6.8 声明和阻止,声明是以下之一:

  

标记语句
化合物语句
表达式语句
选择语句
迭代语句
跳语句

声明只能直接出现在复合语句中(即由{ ... }分隔)或作为for迭代语句中第一个表达式的特殊情况。

答案 3 :(得分:3)

section 6.8.2p1中可以看到,{ ... } - 样式示例,复合语句中允许声明。< / p> 但是,

Section 6.8.4p1涵盖了选择语句的语法(即if (...) ...)并未明确允许任何声明。此外,此表示法需要表达式,如错误消息所示,“预期表达式 ...”

答案 4 :(得分:0)

第一个代码示例声明只在一个空的范围内可见的int ...很难看到该实用程序!第二个显然是有条件的尝试?声明在封闭(函数?)范围内可见的int。很难想象这种条件声明的效用......是否需要运行时重新编译?