我无法理解以下两种情况的输出。 编译器:Windows 上的 Borland C++ 5.02 案例一:
#include <stdio.h>
int main()
{
char str[] = "HELLO";
printf("%abc %2s", str, str);
return 0;
}
output:%abc %2s
案例2:
#include <stdio.h>
int main()
{
char str[] = "HELLO";
printf("abc %2s", str, str); //% sign removed
return 0;
}
output:abc 1310540
请让我理解输出。如果这听起来很幼稚,请原谅。我在 C 语言中有点天真。
最佳答案
这是我的猜测:
printf("%abc %2s", str, str);
您古老的编译器早于引入 %a
格式字符串。因此,运行时意识到它遇到了它无法识别的格式字符串,并放弃尝试格式化。无论如何,您都不能将字符串传递给 %a
并期望得到任何有意义的内容。因此,即使您的编译器理解“%a”,该行为也将是未定义的。试图理解 UB 并没有什么收获。修复您的代码。
printf("abc %2s", str, str);
应该输出
abc HELLO
即使在古老的编译器上也是如此。如果没有,那就是编译器运行时的错误。
我个人准备打赌您的编译器将为该程序生成该输出。我宁愿认为你的问题被错误地转录。问题中的输出与代码不匹配,反之亦然。
这已由您的 Pastebin 确认:
#include<stdio.h>
int main()
{
char str[] = "HELLO";
printf("abc %d", str, str);//different from code in question
return 0;
}
Output: abc -1083086374
因此,不仅讨论 UB 有点毫无意义,而且当您运行的版本与问题中的代码不同时讨论程序就更没有意义了。将来我强烈建议您使用复制/粘贴将代码传输到 Stack Overflow 问题中,并仔细检查输出是否与您声称的相符。
底线:现在是 2013 年了。没有理由使用 BCC v5.02。是时候及时上前了。
关于c - printf 语句中 % 符号在以下情况下的作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16222575/