单语句需要使用花括号吗?

4

2
如果您使用“razor”,则它们始终是必需的。实际上,我有点希望我有一个编译器开关来启用此模式。 - Marc Gravell
同意,当添加 {...} 时,我发现在 if 等语句下的单行语句更易读。排序和花括号。 :D - George Duckett
4个回答

2
在方法体周围。
// not allowed:
int Inc(int x) 
     return x+1; 

为什么需要这个功能并不容易理解,似乎旧式的C语言比C++/C#更需要它。

关于为什么需要这个功能,对于(非常)古老的C语言,你需要这样写:

int Sum()
int a, b; // parameters, very informal
{
   int s; // local var
   ...
}

因此,这种古老的语法需要使用大括号。在所有基于C的编程语言中,没有人认为将它们变成可选项是有意义的,即使在某些情况下是可能的。


你能想到为什么吗?我在思考可能存在歧义的情况(例如try...catch示例中的答案),但是想不出来。 - George Duckett
在C#语法中,将它们设置为可选项可能是有可能的,但设计者为什么要考虑这一点呢? - H H

1

在使用 checkedunchecked 时,您必须根据将它们视为运算符还是语句来选择使用大括号或括号:

// legal operator
int y = checked(x * 2);

// legal statement
unchecked
{
    if ((a * b) > c)
    {
        DoSomething();
    }
}

// illegal operator
int y = checked x * 2;

// illegal statement
unchecked
    if ((a * b) > c)
        DoSomething();

强调一下,操作符/表达式版本的checked()存在非常好地回答了这里的“为什么”。 - H H
@Henk:确实,虽然我不明白为什么编译器不能执行某种上下文分析来确定使用的是哪个版本。(但仅仅因为我看不到潜在的陷阱并不意味着没有任何陷阱。我相信会有一些棘手的角落案例。强制执行大括号/括号规则更容易和 less ambiguous.) - LukeH
可能最好将其拆分为两个答案。switch case是“标签”,就像“goto label12;”一样,遵循该语法模式。但是,对于switch和作用域有一些特殊规则。 - H H
@Henk:没错。我想我可能会彻底删除switch的内容;我只是出于好奇而提到它。虽然switch部分不仅仅是普通的标记语句。例如,编译器不允许从一个case落入到下一个case - LukeH
我仍然认为switch有点符合“需要大括号”的问题精神。例如,while(expression){}是合法的,而while(expression);也是合法的,但是switch(expression){}是合法的,而switch(expression);则不是。 - LukeH

1

语言的某些部分需要存在大括号。例如,当您开始一个方法时,必须打开和关闭大括号以将其标识为代码块。在函数内部,某些语言特性如循环、条件语句等也接受大括号,尽管在某些情况下它们不是必需的。例如:

if (someValue == true)
    doSomething();

在这种情况下,大括号不是必需的,但是您可以用大括号将此语句括起来,因为您只有一个语句将在 if 检查后执行,但如果您想在 if 语句中执行多个语句,则需要使用大括号。例如:
if (someValue == true)
{
    doSomething();
    doSomeMoreWork();
}

不允许尝试类似这样的操作:

if (someValue == true)
    doSomething();
    doSomeMore();
else
    doWork2();
    int i = 1 + 2;

在这种情况下,编译器会抱怨。

问题最好在以下循环中看到:

while(i < 10)
    doSomeWork();
    i++;

在这里你会期望 i 会增加,但事实并非如此。基本上这个循环和下面这个是一样的:

while(i < 10)
{
    doSomeWork();
}

i++;

块内的语句将会无限执行,而且我永远不会递增。在这种情况下,正确的编写方式应该是:

while(i < 10)
{
    doSomeWork();
    i++;
}

现在你有一个正常工作的语句。我喜欢始终使用大括号,无论执行的语句数量如何。原因是,迟早我可能需要在if语句或for或foreach循环内添加更多工作。这只是一个好习惯。

@Downvoter,为什么要给这些帖子点踩呢? - Huske
Huske,回答很长,但完全没有回答问题。 - H H
我不完全同意你的观点,但也无可厚非。我认为回答何时和为什么需要使用大括号相当困难,因此我尝试描述了一些情况,并给出了何时以及如何使用大括号的想法。 - Huske
我认为乔治可以选一个更具体的标题。 - H H

0

类/结构体/接口声明

class X { int _myval }


真的,但语法的不同部分非常不同。一个类不包含语句,而是声明。 - H H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接