我想知道具体printf("%d",x)是如何解释的。我只知道编译器保留一个内存来放置'%', '%d','\0'并将其地址返回到,然后根据我们指定的格式说明符printf打印第二个参数。x
那么,如果我使用 example int x=5; char *p="%d"; printf(p,x),它与 是一样的吗printf("%d",x)?
又是如何
printf("%d",x)解释的呢?
OP 的解释是代码的一种潜在的部分描述。
然而,C 和 C++ 通常是编译的,而不是解释的。今天的编译器可以检查printf("%d",x)并发出类似print_an_integer(x);.
对于 OP 的示例,两个代码在功能上是相同的,但编译器可能无法识别上述第一个代码的优化潜力。
int x=5;
// In C++, should be `const char *p="%d";`
char *p="%d";
printf(p,x);
// same as ????
printf("%d",x);
Run Code Online (Sandbox Code Playgroud)
相反,会处理传递给的格式字符串printf(),查找要打印的字符并打印说明符。打印说明符依次获取下一个参数并相应地处理它们。
如果格式字符串和参数不匹配(例如printf("%f",x)or )p="%d"; printf(p, 5.0),则结果是未定义的行为。
...具体如何...
编译器在形成发出的代码方面有很大的自由度。它需要满足虚拟机的等效功能要求——而不是OP的解释。任何确切的解释都取决于编译器和代码。