C速记{}

C速记{},c,syntax,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) {

我继承了一些代码,当调用它时,它的格式是这样的。明确地说,某些函数定义如下:

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?
}
我以前从未见过这样的语句,我觉得因为某些函数是空的,并且从不返回值,所以它永远不会运行括号中的代码。

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

通常,复合语句用作由
if
while
for
等控制的语句:

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

提供一个局部范围,因此复合语句是
{
,后跟零个或多个声明和语句,后跟
}
。复合语句被视为单个语句

通常,复合语句用作由
if
while
for
等控制的语句:

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

提供一个局部范围,所以它是有效的语法,但在这种情况下没有什么用处。删除额外的大括号不会改变代码的含义

但是,如果您想限制局部变量的范围,则放置额外的大括号有时很有用。例如,如果我想交换
a
b
的值,我可以编写

int a;
int b;

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

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

因此,不要将
temp
变量浪费在名称空间中。这在C++中更有用,其中自动存储持续时间变量的析构函数将在范围出口中自动运行。

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

但是,如果您想限制局部变量的范围,则放置额外的大括号有时很有用。例如,如果我想交换
a
b
的值,我可以编写

int a;
int b;

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

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

因此,不要将
temp
变量浪费在名称空间中。这在C++中更有用,其中自动存储持续时间变量的析构函数将在范围出口处自动运行。

是否尝试在调试器中通过代码来查看发生了什么?某个函数无效,因此不能使用返回值。您确定复制的代码正确吗?我希望在第二个代码块的第一行有一个分号。你确定它不是
某个函数(…);{…}
?换句话说,调用一个函数,然后是一段代码。是的,对不起,我写了一个示例,没有直接复制,这可能违反了这里的规则:);现在已添加到正确的位置。
{{{{}}
是C语言中的有效语句。是否尝试在调试器中单步执行代码以查看发生了什么?某些函数无效,因此无法使用返回值。您确定复制的代码正确吗?我希望在第二个代码块的第一行有一个分号。你确定它不是
某个函数(…);{…}
?换句话说,调用一个函数,然后是一段代码。是的,对不起,我写了一个示例,没有直接复制,这可能违反了这里的规则:);现在添加到正确的位置。
{{{{}}
是C中的有效语句。