为什么我可以用2returns编译一个代码?

Why can I compile a code with 2 returns?

因为我来自 java 岛,所以我很奇怪为什么编译器不会像这样警告无法访问的代码:

int main(int argc, char** argV)
{

    std::list<int> lst = {1,2,3,4};

    return 0;



    std::cout << "Done!!!" << std::endl;
    return 0;
}

我的问题:

为什么我可以用2returns编译一个代码?

我的编译器是 c++11 的 gcc,在 Windows,代码块

因为这部分

std::cout << "Done!!!" << std::endl;
return 0;

将永远不会被调用,因为第一个 return 语句,但这不是中止编译的错误,而是编译器可能会发出警告,具体取决于您使用的编译器(例如 Microsofts VC++ 编译器警告你。

主要是因为编译器往往无法确定。 (在 Java 中曾尝试这样做,但定义 可达性 的标准已经确定。)

在这种情况下,确实很明显。

有些编译器确实会发出可达性警告,但 C++ 标准不需要这样做。

如果不参考以下内容,关于可达性的回答是不完整的:https://en.wikipedia.org/wiki/Halting_problem

作为对 Java 的最后评论,请考虑以下两个 Java 片段:

if (true){
    return;
}
; // this statement is defined to be reachable

while (true){
    return;
}
; // this statement is defined to be unreachable

以我的愚见,两全其美的情况已经达到。

无法访问的代码在 C++ 中不是编译错误,但通常会给出警告,具体取决于您的编译器和标志。

您可以尝试在调用编译器时添加-Wall 选项。这会 激活许多有用的警告。

这有两个原因:

  1. C++ 有许多标准(c++11、c++14、c++17 等),不像 java(java 在标准和java 唯一真正重要的是您使用的版本),因此,一些编译器可能会警告您有关无法访问的代码,而其他编译器可能不会。

  2. return 0之后的语句,虽然逻辑上不可达,但不会造成歧义、语法错误等致命错误,而且编译容易(如果编译器愿意的话; )).

为什么不能编译具有多个 return 的代码? 因为代码无法访问?大多数编译器会为此发出警告。

但是,我经常看到这样的代码:

   if(a)
   {
      // Do stuff
   }
   else
   {
      // Do other stuff

      if(b)
      {
          // Do more stuff
      }
      else
      {
          // Do other more stuff
      }
   }

可以简化为

   if(a)
   {
      // Do stuff
      return;
   }

   // Do other stuff

   if(b)
   {
      // Do more stuff
      return;
   }

   // Do other more stuff

大约十年前,人们不赞成在一个方法的函数中使用多个 return,但对于现代编译器,确实没有理由继续反对它。

I wounder why the compiler doesnt warns about unreachable code in something like

在 gcc documentaion 中对警告有很好的解释:

-Wunreachable-code

Warn if the compiler detects that code will never be executed. This option is intended to warn when the compiler detects that at least a whole line of source code will never be executed, because some condition is never satisfied or because it is after a procedure that never returns.

It is possible for this option to produce a warning even though there are circumstances under which part of the affected line can be executed, so care should be taken when removing apparently-unreachable code.

For instance, when a function is inlined, a warning may mean that the line is unreachable in only one inlined copy of the function.

This option is not made part of -Wall because in a debugging version of a program there is often substantial code which checks correct functioning of the program and is, hopefully, unreachable because the program does work. Another common use of unreachable code is to provide behavior which is selectable at compile-time.

虽然 g++ 5.1.0 不会为此代码生成任何警告,即使启用了此选项。