编译器将C语言转换成机器代码,CPU可以执行这些代码。通常很容易看出哪些字节的机器代码对应于C代码中的哪些语句。调试器在显示C代码如何运行时使用此对应关系。
因此,“声明不是可执行语句”的意思是没有任何机器代码与声明相对应。这也意味着:
CPU不会花费任何时间来“运行”声明(但编译器确实会花时间检查它)可视化调试器将在一步一步地运行程序时“跳过”声明。您可以在在线编译器资源管理器中看到这一点,它用于C++,但它与C非常接近。它以不同的颜色绘制每一行代码,以可视化哪一行生成哪一行机器代码。以下是一个例子:
输入C/C++代码
代码语言:javascript运行复制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输出程序集代码(表示机器代码)
代码语言:javascript运行复制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您可以看到用白色(声明)绘制的“不生成代码”和“非可执行语句”的行。
“不可执行”的想法不是一条硬性规则,只是一条准则。在某些情况下,声明是“可执行的”:
代码语言:javascript运行复制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)