陌生的C速记{}

时间:2015-09-23 19:43:23

标签: c syntax

我继承了一些代码,并且在调用时它有一个这样的格式。要清楚一些函数是在这样的地方定义的:

void some_function(int a, int b, int c){
     printf("hi there\n");
}

然后在主代码中调用它:

some_function(2, 3, 4);
{
       x = 1200;
       another_function(&x);
}

以上只是简短的说法:

if(some_function(2,3,4) == 1)
{
    //then execute code found here?
}

我之前从未见过那个,我觉得因为some_function是void而且永远不会返回一个值,它永远不会在括号中运行代码?

2 个答案:

答案 0 :(得分:7)

复合语句{,后跟零个或多个声明和语句,后跟}。复合语句被视为单个语句。

通常,复合语句用作由ifwhilefor等控制的语句:

if (condition)
{
    blah;
    blah;
}

但它可以在任何可以使用单个语句的地方使用。 (复合语句有时称为;严格来说复合语句是一种块。)

它可以用作定义局部变量的方法:

 blah;
 {
     int n = 42;
     /* ... */
 }
 /* n is not visible here */

在你的例子中:

some_function(2, 3, 4);
{
       x = 1200;
       another_function(&x);
}

额外{}是合法的,但没用;它们可以省略而不改变程序的含义。 (作者可能打算将这些语句标记为逻辑分组。)

复合语句在逻辑上与函数调用无关;它碰巧跟着它。

如果代码类似于:

,那么在这里使用复合语句会更有意义
some_function(2, 3, 4);
{
       int x = 1200;
       another_function(&x);
}

因为它会为变量x提供本地范围。

答案 1 :(得分:0)

这是有效的语法,但在这种情况下没有任何好处。删除额外的大括号不会改变代码的含义。

但是,如果要限制局部变量的范围,则添加其他大括号有时很有用。例如,如果我想要交换ab的值,我可能会写

int a;
int b;

// Lots of code that assigns values to `a` and `b`.

{
  int temp;
  temp = a;
  a = b;
  b = temp;
}

所以不要使用temp变量丢弃名称空间。这在C ++中更有用,其中具有自动存储持续时间的变量的析构函数将在范围退出时自动运行。