c++ - For 循环不会在没有 return 语句的 int 函数中终止
问题描述
在 Arduino Uno 上,在不返回任何内容的 int 函数中,for 循环的行为非常奇怪。
void setup() {
Serial.begin(9600);
}
void loop() {
foo();
Serial.println("Never reached");
}
int foo() {
for (int i = 0; i < 9; i++) {
Serial.println(i);
}
}
这将输出以下内容,并继续通过 ASCII 无限循环...
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
此外,将 for 条件设置为 i < 12 使其永远以数字方式计数,没有 ASCII 输出。
这一切都通过添加return 0;
到 foo() 来解决,但我很好奇为什么会发生这种情况。有任何想法吗?
解决方案
C++ 语言有一个未定义行为的概念。可以编写不构成程序的代码。
一旦未定义行为的示例不是从声明为的函数返回值int foo()
。从优化编译器的角度来看,函数永远不会返回,因为不可能在int foo()
不返回int
值的情况下返回,因此它优化了循环结束条件。
检查你的编译器警告 - 应该有一个关于可能丢失的警告return
。
如果你不打算从 中返回任何东西foo()
,那么应该声明它void foo()
。
推荐阅读
- c# - 如果字符串数组中的列名在字符串数组中具有匹配值,则获取 DataRow
- java - 在 openapi 文件中添加 helidon 对象健康和指标
- javascript - Node/Postgresql Error: connect ECONNREFUSED 127.0.0.1:5432 at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1141:16)
- python - 用于计算市场流域的 MCP Geometrics
- javascript - AJAX 和 PHP 中的多个同名字段
- python - 循环执行时遇到问题
- rust - 如何从使用 actix_web::HttpRequest 获取 json 到结构中?
- webrtc - 谁能给我一个simplepeer中sdpTransform选项的例子
- javascript - React-Native-Navigation,通过 navigation.navigate("routename", {randomparams}) 导航到它时如何刷新路由
- java - 如何在 Java 断言语句中评估多行循环?