【发布时间】:2017-03-01 12:20:38
【问题描述】:
我想知道编译器是否有办法理解两个 if 语句不能同时为真,并添加“隐式 else”。例如在此代码示例中:
int main() {
char c;
scanf_s("%c", &c, 1);
if (c == '1') {
printf("received 1\n");
}
if (c == '2') {
printf("received 2\n");
}
return 0;
}
c 不能是'1' 和 '2',但是在Visual Studio 中编译和反汇编后,我注意到它会检查第二个if,无论如何。
【问题讨论】:
-
检查发布版本。
-
除了“有可能,但取决于编译器”,您还期待什么答案?
-
除非有人非常具体地教编译器 scanf 和 printf 做什么,否则 scanf 可能会将指向 c 的指针存储在某个全局变量中,而 printf 可能会通过该指针修改 c。如果你用不那么不透明的东西替换 printf,gcc 会进行优化。
-
@Toby - 在这方面你比我更乐观。我认为“C/C++”问题的倾盆大雨永远不会减少。
-
磁盘空间不足吗?为什么不使用
} else if ...?在你写完这个问题的时候,你可以看看生成的汇编代码,或者——更好的是——添加else。