gpt4 book ai didi

c - printf 以多个指针作为 C 中的参数

转载 作者:行者123 更新时间:2023-12-03 22:56:48 25 4
gpt4 key购买 nike

printf()的行为是什么?当我们在没有格式说明符的情况下为其提供多个参数时?
例子:

int main() 
{
printf("hello", "hi");
return 0;
}
为什么编译器在编译上述程序时会产生警告? :
warning: too many arguments for format [-Wformat-extra-args]
如果我们编译如下类似的程序:
int main() 
{
char *s1 = "hello";
char *s2 = "hi";
printf(s1, s2);
}
不产生警告。这是什么原因?
另外,为什么两个程序都输出 hello仅,并且不要同时打印 hi ?

最佳答案

C 2018 标准规定了 printf 的行为在第 7.21.6.3 条中,其中第 2 段表示“printf函数等价于 fprintf与参数 stdout插入到 printf 的参数之前。”
标准规定了fprintf的行为在 7.21.6.1 中,它告诉我们第二个参数(printf 的第一个参数)是一个格式字符串,它可能包含由字符“%”引入的各种转换规范。因此,在 printf("hello", "hi") , "hello"是没有转换规范的格式字符串。在这种情况下,第 2 段告诉我们会发生什么:

If the format is exhausted [fully processed] while arguments remain, the excess arguments are evaluated (as always) but are otherwise ignored.


因此,在 printf("hello", "hi") , "hi"被忽略,并且 "hello"是仅包含普通字符的格式字符串,根据第 3 段将这些字符复制到输出流中。
编译器警告 printf("hello", "hi")因为它能够看到这个调用包含一个多余的参数,因为格式字符串不包含它的转换规范。
您的编译器没有警告 printf(s1,s2);因为它不分析什么 s1将在此调用期间包含。在这种情况下,这种分析并非不可能,但这种情况很少见:当程序员使用指向字符串的指针作为 printf 的格式字符串时。 ,它通常是在程序执行过程中计算、构造或选择的字符串或指针,而这种计算方式往往超出了编译器的分析能力。指针显然是指向固定字符串的指针的情况很少见,因为它们并不经常有用,所以大概编译器实现者没有发现实现编译器处理这些情况所需的代码是有值(value)的。

关于c - printf 以多个指针作为 C 中的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63003621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com