在将一些 C 代码移植到 Windows 时,我在 MSVC++ 中发现了一个有趣的三元运算符行为。编译器似乎? :在以下示例中评估了两个分支:
#include <stdio.h>
struct S {
int x;
};
int getNum() {
printf("get num\n");
return 4;
}
int main(int argc, char **argv) {
struct S s = argc ? (struct S) { .x = getNum() } : (struct S) { .x = getNum() };
printf("%d\n", s.x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
印刷:
get num
get num
4
Run Code Online (Sandbox Code Playgroud)
但是,GCC 和 ClanggetNum()仅评估一次。哪种行为是正确的或标准允许的?