-1

我刚刚通过更改编号注意到 printf 函数的不同行为。参数和格式说明符。请查看以下代码:

#include<stdio.h>
void main()
{ int ji=65;
  printf("ji>=65 ? %d : %c",ji);
 }

输出结果是ji>=65 ?65 : A
打印的字符是 A
但是如果代码是:

#include<stdio.h>
void main()
{ int ji=65,y;
  printf("ji>=65 ? %d : %c",ji);
  printf("%d",y)
}

在这种情况下打印的字符是heart(ascii value 3)并且y的值是12803

编译器如何拾取字符值???请帮忙

4

3 回答 3

10

在发布的代码中调用会printf()导致未定义的行为:

printf("ji>=65 ? %d : %c",ji); /* One less argument than required for
                                  the supplied format. */

从第7.19.6.1节C99 标准的 fprintf 函数:

fprintf 函数将输出写入 stream 指向的流,在 format 指向的字符串的控制下,该字符串指定后续参数如何转换为输出。如果格式的参数不足,则行为未定义。如果格式已用尽而参数仍然存在,则评估多余的参数(一如既往),否则将被忽略。当遇到格式字符串的结尾时,fprintf 函数返回。

此行为也适用于printf()函数(以及sprintf()andsnprintf()函数)。

于 2013-02-12T17:44:52.303 回答
0

如果传递给的参数的数量printf少于格式字符串中的转换说明符的数量,或者如果相应的转换说明符的参数类型不正确,则行为是undefined,这意味着几乎任何结果都是可能的(并被认为是“正确的”)。 如何获得该结果将因情况而异。

如果传递给的参数数量printf大于转换说明符的数量,则评估附加参数,否则将被忽略。

请注意,块作用域变量 likey不会隐式初始化为任何特定值;它们的值是不确定的,甚至可能是一个陷阱值,所以你不应该期望第二printf条语句有任何特定的输出。

此外,除非您的编译器文档明确将其列为有效签名,void main()否则也会导致未定义的行为。改为使用int main(void)

于 2013-02-12T17:53:24.553 回答
0

它是从堆栈中取出的。您告诉 printf 它可以从堆栈中获取 2 个参数,但您只提供 1 个参数。Printf 不知道这一点,并获取堆栈上的下一个值,该值很可能是调用 printf 期间保存的寄存器的值。

但请注意:您获得的值始终是未定义的。

于 2013-02-12T17:45:56.593 回答