为什么 switch 语句中的 return 语句被视为从函数返回,而不是从 switch 返回?

问题描述 投票:0回答:2

我正在学习

c++
。我尝试用
g++ main.cpp -o main.exe
来编译它:

#include <iostream>

int main()
{
    switch(int x = 2)
    {
        case 2:
            std::cout << "2";
            return;
        default:
            std::cout << "other";
            return;
    }
    return 0;
}

但是,在这种情况下,编译器会产生以下错误:

main.cpp: In function 'int main()':
main.cpp:10:13: error: return-statement with no value, in function returning 'int' [-fpermissive]
   10 |             return;
      |             ^~~~~~
main.cpp:13:13: error: return-statement with no value, in function returning 'int' [-fpermissive]
   13 |             return;
      |             ^~~~~~

所以,我尝试使用

-fpermissive
选项,如错误消息中所示:
g++ main.cpp -o main.exe -fpermissive
。现在,编译器产生警告,程序编译成功:

main.cpp: In function 'int main()':
main.cpp:10:13: warning: return-statement with no value, in function returning 'int' [-fpermissive]
   10 |             return;
      |             ^~~~~~
main.cpp:13:13: warning: return-statement with no value, in function returning 'int' [-fpermissive]
   13 |             return;
      |             ^~~~~~

据我了解,这种行为是因为编译器将 switch 中的

return
语句确定为离开
main
函数的信号,但它具有
int
类型,并且在这种情况下需要返回值。
但为什么它不将其确定为从交换机离开的信号呢?

我使用 GNU GCC 和 Windows 10。

c++ gcc switch-statement return g++
2个回答
2
投票

这种行为是因为编译器将 switch 中的 return 语句确定为离开 main 函数的信号,但它是 int 类型,在这种情况下需要一个返回值。

您的理解是正确的。

但是为什么它不将其确定为从开关离开的信号?

因为

return
被指定从出现该语句的函数返回。

8.7.4。

return
声明
[stmt.return]

  1. 函数通过 return 语句返回到其调用者。

要只留下最接近的

switch
,可以使用
break
语句:

8.7.2

break
声明
[stmt.break]

  1. break
    语句应包含在(8.1)迭代语句(8.6)或
    switch
    语句(8.5.3)中。这
    break
    语句导致最小的此类封闭语句的终止;控制权传递给语句 遵循终止语句(如果有)。

还有其他选项可以只保留

switch
,例如使用
goto
或引发异常,但
break
语句是最常用的。


2
投票

我需要使用

break
而不是
return
:

#include <iostream>


int main()
{
    switch(int x = 2)
    {
        case 2:
            std::cout << "2";
            break;
        default:
            std::cout << "other";
            break;
    }
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.