一行中函数调用的执行顺序 - 未定义?

Ste*_*e M 0 c c++

p.77 K&R C表示以下程序的输出未定义,但当前版本的Xcode没有发出警告.目前的标准还没有定义吗?在C++中怎么样?Java和C#中类似程序的加分点.

#include <stdio.h>

int my_m()
{
    static int n = 0;
    static int m[] = { 42, 57 };
    return n++ % 2 == 0 ? m[0] : m[1];
}
int main()
{
    printf("%d" , my_m() - my_m());

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jer*_*fin 5

结果实际上并未定义,只是未指定.

不同之处在于,未定义的行为意味着任何事情都可能发生,包括似乎与程序中的任何内容完全无关的行为.经典的一句话是它"让恶魔飞出你的鼻子".

未指定意味着您无法知道将首先评估哪个调用以及my_m将在第二个评估哪个调用,它将是1个调用然后是另一个调用.一个调用将开始并运行完成,然后另一个调用将开始并运行完成 - 两个将不会交错或类似的任何内容.唯一不可预测的是两次调用的顺序(是的,根据当前的C和C++标准,订单仍然是100%不可预测的).

在C#和Java中,评估顺序从左到右指定.


或者至少它会像它一样.C和C++都遵循通常所谓的"似乎规则",它允许编译器以不同的方式执行操作,只要它以维护指定的外部可见行为的方式执行.