我最近发现
所有我的研究显然给出了关于while或switch循环的结果,甚至没有提及这种语法,所以我猜它更多是合法但非常罕见和可能无用的东西,滥用了标准。 有人能帮我理解这个吗?
编辑: 正如 @phuclv 的答案中所解释的那样,switch语句期望紧随其后的是选择语句,可以是带有一些代码的括号(在这种情况下...可能是case语句)或者带有自己括号的循环等,这意味着在C语言中这是合法的:
什么都没有显示出来,程序立即退出,因为 switch (1) 没有 case 1 或 default 语句。 如果我们添加一个:
程序无限循环,因为最嵌套的循环是 switch (0),没有 case 0 或 default。
结论:while (0) 只是一种滥用,并且除了混淆外没有任何实用性,但这仍然是一个有趣的事情要知道。
switch (...) while (0) {}
在C语言中是合法的(在这里),但我找不到关于这个东西的解释。
我在互联网上唯一看到这种情况的另一个例子是在一个 混淆 GitHub 代码库 中,没有任何解释。所有我的研究显然给出了关于while或switch循环的结果,甚至没有提及这种语法,所以我猜它更多是合法但非常罕见和可能无用的东西,滥用了标准。 有人能帮我理解这个吗?
编辑: 正如 @phuclv 的答案中所解释的那样,switch语句期望紧随其后的是选择语句,可以是带有一些代码的括号(在这种情况下...可能是case语句)或者带有自己括号的循环等,这意味着在C语言中这是合法的:
switch (...) while (...) switch (...) {}
switch
完全不关心后面跟着的语句,它似乎只是寻找 case 和/或 default。
switch (1) while (0) {
puts("Not executed");
}
puts
语句不会被执行,因为没有case/default语句,所以这个switch基本上是无用的。
你可以在Compiler Explorer上查看,GCC会发出警告并删除了switch语句。
然而,请注意:
#include <stdio.h>
int main(void) {
switch (1) while (1) switch (0) {
case 1:
puts("hello");
}
}
什么都没有显示出来,程序立即退出,因为 switch (1) 没有 case 1 或 default 语句。 如果我们添加一个:
switch (1) case 1: while (1) switch (0)
程序无限循环,因为最嵌套的循环是 switch (0),没有 case 0 或 default。
结论:while (0) 只是一种滥用,并且除了混淆外没有任何实用性,但这仍然是一个有趣的事情要知道。