编译器将C语言转换为机器码,CPU可以执行该代码。通常很容易看出哪些机器码字节对应于C代码中的哪些语句。调试器使用这种对应关系来展示您的C代码运行方式。
所以,“声明不是可执行语句”的意思是没有与声明相对应的机器码。这也意味着:
CPU不会花费任何时间来“运行”声明(但编译器确实需要花费时间来检查它)
在逐步运行程序时,可视化调试器将跳过声明
您可以在在线编译器资源管理器中看到这一点,它是针对C++实现的,但对于C来说也足够接近。它会为每行代码着不同的颜色,以可视化哪些行生成了哪些机器代码。以下是其中一个示例:
输入C/C++代码
int square(int num) // painted in white
{ // painted in teal
int result; // painted in white
result = num * num; // painted in yellow
return result; // painted in gray
} // painted in red
输出汇编代码(代表机器码)
square(int):
push rbp // painted in green
mov rbp, rsp // painted in green
mov DWORD PTR [rbp-20], edi // painted in green
mov eax, DWORD PTR [rbp-20] // painted in yellow
imul eax, DWORD PTR [rbp-20] // painted in yellow
mov DWORD PTR [rbp-4], eax // painted in yellow
mov eax, DWORD PTR [rbp-4] // painted in gray
pop rbp // painted in red
ret // painted in red
你可以看到,用白色绘制的行(声明)“不生成代码”,并且“不是可执行语句”。
“不可执行”的概念并非硬性规定,而只是一项指导方针。以下情况下声明是“可执行”的:
int x = 0; // a trivial calculation, but it will appear in machine code
int y = x * (x + 1); // a non-trivial calculation
int a[rand() % 10 + 1]; // possible without initialization too (suggested by by user AnT)