我正在学习
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
类型,并且在这种情况下需要返回值。这种行为是因为编译器将 switch 中的 return 语句确定为离开 main 函数的信号,但它是 int 类型,在这种情况下需要一个返回值。
您的理解是正确的。
但是为什么它不将其确定为从开关离开的信号?
因为
return
被指定从出现该语句的函数返回。
8.7.4。
return
声明[stmt.return]
要只留下最接近的
switch
,可以使用break
语句:
8.7.2
break
声明 [stmt.break]
break
语句应包含在(8.1)迭代语句(8.6)或switch
语句(8.5.3)中。这
break
语句导致最小的此类封闭语句的终止;控制权传递给语句
遵循终止语句(如果有)。还有其他选项可以只保留
switch
,例如使用 goto
或引发异常,但 break
语句是最常用的。
我需要使用
break
而不是 return
:
#include <iostream>
int main()
{
switch(int x = 2)
{
case 2:
std::cout << "2";
break;
default:
std::cout << "other";
break;
}
return 0;
}