C语言中switch(...) while(0)语法的合法性及作用解析
关于C语言中
switch (...) while (0) {}语法的解析 我最近发现switch (...) while (0) {}在C语言中是合法的,但找不到相关解释。仅在一个代码混淆的仓库中见过该写法,同样没有解释。
查阅资料时,结果都只涉及while或switch单独的用法,完全没提到这种语法。我猜测这是一种合法但极为罕见、可能无用的标准滥用,希望有人帮忙理解它。
语法解析
switch语句后需紧跟一个选择语句,可以是包含case语句的代码块,也可以是带有自身代码块的循环等。这意味着以下写法在C语言中是合法的:
switch (...) while (...) switch (...) {}
switch并不关心后续跟随的是什么语句,它只会查找case和/或default标签。
比如这段代码:
switch (1) while (0) { puts("Not executed"); }
其中的puts语句不会执行,因为没有匹配的case或default标签,此时switch基本无用,编译器会给出警告并移除该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)在这里只是对C语言语法的滥用,除了用于代码混淆外没有实际用途,但了解这种语法细节对理解C语言的语法规则仍有意义。
内容的提问来源于stack exchange,提问作者Chi_Iroh
相关产品推荐
相关产品推荐

