For 循环不会在没有 return 语句的 int 函数中终止

Gre*_*ton 2 c++ arduino undefined-behavior

在 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容,并继续无限循环通过 ASCII ...

0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
Run Code Online (Sandbox Code Playgroud)

此外,将 for 条件设为 i < 12 使其永远以数字方式计数,没有任何 ASCII 输出。

这都是通过添加return 0;到 foo() 来解决的,但我很好奇为什么会发生这种情况。有任何想法吗?

rus*_*tyx 5

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

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

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

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