在C语言中,我什么时候可以省略花括号?我之前见过没有花括号的return
语句,例如:
When can I omit curly braces in C? I've seen brace-less return
statements before, such as
if (condition)
return 5;
但是这种方法似乎并不总是适用于所有语句,例如声明方法时。
省略大括号的规则与Java中的规则相同吗?
在C语言中,我什么时候可以省略花括号?我之前见过没有花括号的return
语句,例如:
When can I omit curly braces in C? I've seen brace-less return
statements before, such as
if (condition)
return 5;
但是这种方法似乎并不总是适用于所有语句,例如声明方法时。
省略大括号的规则与Java中的规则相同吗?
只有当条件语句 (if-else
)、循环语句 (for
、while
、do-while
) 或者 switch
语句的执行体只包含一个语句时,才可以省略大括号:
if (cond)
do_something();
for (;;)
do_something();
while(condition)
do_something();
do
do_something();
while(condition);
然而,请注意以上每个例子在语法上都被视为单个语句;这意味着你可以编写类似以下的内容:
if (cond1)
if (cond2)
do_something();
这是完全合法的;if (cond2) do_something();
会被简化为一个语句。同样地,if (cond1) if (cond2) do_something();
也是一个语句,因此您可以使用类似 if (cond1) if (cond2) if (cond3) do_something();
的方式进一步陷入疯狂。
for (i=0; i < N; i++)
if (cond1)
if (cond2)
while (cond3)
for (j=0; j < M; j++)
do_something();
不要那样做。
void say_hello(void) printf("Hello, World!\n");
但由于大多数函数定义包含多个声明和/或语句,允许这样做并没有太多优势。
还有一个单独的问题:什么时候应该省略大括号。在我个人看来,答案是“很少”。这个:
if (condition)
statement;
是完全合法的,但这个:
if (condition) {
statement;
}
在我看来,使用IMHO更加流畅且易于维护(如果我想要添加第二个语句,花括号已经在那里了)。这是我从Perl中学到的习惯,它要求在所有这种情况下都使用花括号。
唯一不使用花括号的时候是当整个 if 语句或类似的东西适合单行,并且这样做可以使代码更易读,并且我不太可能想要添加更多语句到每个 if
中时:
if (cond1) puts("cond1");
if (cond2) puts("cond2");
if (cond3) puts("cond3");
/* ... */
我发现这样的情况相当罕见。即使在这种情况下,我仍然会考虑添加大括号:
if (cond1) { puts("cond1"); }
if (cond2) { puts("cond2"); }
if (cond3) { puts("cond3"); }
/* ... */
if
、for
等)中始终使用{}
,即使只有一个语句。MISRA-C是一个例子。 - ouahint a[2][2] = {{1, 2}, {3, 4}};
您可以使用有效的等价形式:
int a[2][2] = {1, 2, 3, 4};
当你想要将多个语句或表达式组合成一个时,主要需要使用花括号,例如:
{
x = 1;
y = 2;
}
if
或else
中,则花括号中的整个内容将作为一个整体执行,而如果省略花括号,则只有第一个内容(在此示例中为x = 1;
)将被用作if
或else
的一部分。switch()
一起使用。switch (x)
{
case 1:
// Do something
break;
case 2:
// Do something else
break;
}
通常在使用do-while
语句时需要它们:
do
{
printf("%d\n", x);
x++;
} while (x < 10);
C89编译器使这种操作成为可能。
int main(void)
{
puts("Hello, World!");
{
int x;
for (x = 0; x < 10; x++)
printf("%d\n", x);
}
return 0;
}
您可以使用它们来开始和结束函数体、结构/联合定义、枚举定义、结构/联合/数组的初始化,例如:
void blah(void)
{
}
enum e
{
e1 = 1,
e2 = 2
};
struct s
{
int foo;
int bar;
} s = { 1, 2 };
int a[3] = { 1, 2, 3 };
char str2[] = { "abc" };
char str1[] = "abc";
{}
包围。 - ouahfor(...)
printf("brackets can be omitted here");
if(...)
printf("brackets can be omitted here");
else
printf("brackets can be omitted here too");
等等...您总是可以添加它们。这样做从来没有坏处,而且有助于澄清范围,但您非常安全。我能想到的唯一“陷阱”是如果您尝试在该范围内进行声明(顺便说一句,这是无用的):
if(...)
int a = 5;
if(...)
value++, printf("updated value with brackets");
关于你的第二个问题,你可以在Java规范中看到规则是相同的。我特别链接到了if
部分,但你可以看到在if
后面需要一个语句,因此你可以跳过花括号。
每当有一个代码块有多行(将每个语句的分号算作一行)时
例如:
for (i = 0; i < j; i++ )
foo(i);
while (1)
foo();
if( bool )
foo();
void cheese()
printf("CHEESE");
上述行中分号后面的所有内容都不被视为块内部,就好像有 { } 一样。
以下似乎有点棘手:
if (...)
printf("I'm conditional\n");
我猜C预处理器会处理空行,所以这个语句是没问题的。当然这是非常不好的实践方法。
if
后面的下一条语句或块将被用作其主体,即使它们相隔20个空行并且没有正确缩进。误导性缩进是另一个问题,但编译器终于开始警告这个问题了。基本上,将大括号放在所有东西周围,并停止思考!绝对不要把C当成Python... - underscore_d#include <stdio.h>
int main(){
for(int i=0; i<10;i++, printf("%d ", i), printf("%d\n", i));
return 0;
}
1 ... 10
我从另一个帖子中复制了自己的答案。