gpt4 book ai didi

c - 用于选择和迭代语句的新 block 范围

转载 作者:行者123 更新时间:2023-12-01 23:13:31 25 4
gpt4 key购买 nike

在 C99 中,迭代语句和选择语句有新的 block 作用域,我知道 ifwhile 等本身是 block ,因为它们的子语句也没有{}

C11规范:

6.8.4:

A selection statement is a block whose scope is a strict subset of the scope of its enclosing block. Each associated substatement is also a block whose scope is a strict subset of the scope of the selection statement.

6.8.5

An iteration statement is a block whose scope is a strict subset of the scope of its enclosing block. The loop body is also a block whose scope is a strict subset of the scope of the iteration statement.

但如果我这样做:

if( (int a = 10) == 10 ) // error: expected expression before '==' token
int j = 10; // error: expected expression before 'int'

GCC 给我错误。

如何验证 C99 新规则?

谁能给我一些可行的例子吗?

最佳答案

C 语言语法根本不允许您尝试完成的任务。 N1570 §6.8.4/p1:

Syntax
 selection-statement:
  if ( expression ) statement

表达式语句都不被视为声明(声明表达式最严格)。最好的方法是将声明放在 {} 括号内,例如:

int a = 10;
if (a == 10) {
int j = 10;
}

标准允许的唯一情况(实际上是由 C99 引入的)是在 for 循环中放置声明而不是初始化表达式:

for (int a = 0, b = 0; a + b < 20; a++, b++) {
int j = 10;
}

引用§6.8.5/p1(参见表格):

Syntax
 iteration-statement:
  while ( expression ) statement
  do statement while ( expression ) ;
  for ( expressionopt ; expressionopt ; expressionopt ) statement
  for ( declaration expressionopt ; expressionopt ) statement

这里真正的问题是,如果您不能将 if 语句(从第 6.8.4/p5 节开始)的单独作用域与声明表达式一起使用,那么它的目的是什么。您会发现这只能通过 for 循环实现。

关于c - 用于选择和迭代语句的新 block 范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com