不熟悉 C shorthand { }

unfamiliar C shorthand { }

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

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是无效的并且永远不会returns一个值它永远不会运行括号中的代码?

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

通常复合语句被用作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.

提供局部作用域

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

但是,如果您想要限制局部变量的范围,则放置额外的大括号有时是有用的。例如,如果我想交换 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++ 中更有用,其中具有自动存储持续时间的变量的析构函数将在范围退出时自动 运行。