首页 > 解决方案 > 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++arduinoundefined-behavior

解决方案


C++ 语言有一个未定义行为的概念。可以编写不构成程序的代码。

一旦未定义行为的示例不是从声明为的函数返回值int foo()。从优化编译器的角度来看,函数永远不会返回,因为不可能在int foo()不返回int值的情况下返回,因此它优化了循环结束条件。

检查你的编译器警告 - 应该有一个关于可能丢失的警告return

如果你不打算从 中返回任何东西foo(),那么应该声明它void foo()


推荐阅读