C 为什么我会得到printf的这个意外输出?

C 为什么我会得到printf的这个意外输出?,c,C,我试图了解printf在这些情况下是如何工作的:(这是一个测试中的额外问题) 案例1: int d=1; printf("%d",(int)"printf("%d); 输出:0 案例2:(末尾没有%d) 输出:15554368 这是怎么回事?第二个%d不是printf()说明符,是%模除运算符和int变量d的值为1,有什么区别?他们根本不一样 第二个问题是,您正在投射指向int的指针,该指针的定义不明确。让我们从第二个示例开始: int d=1; printf("%d",(int)"print

我试图了解
printf
在这些情况下是如何工作的:(这是一个测试中的额外问题)

案例1:

int d=1;
printf("%d",(int)"printf("%d);
输出:
0

案例2:(末尾没有
%d

输出:
15554368


这是怎么回事?第二个
%d
不是
printf()
说明符,是
%
模除运算符和
int
变量
d
的值为
1
,有什么区别?他们根本不一样


第二个问题是,您正在投射指向
int
的指针,该指针的定义不明确。

让我们从第二个示例开始:

int d=1;
printf("%d",(int)"printf(");
”printf(“
这里是一个字符串常量,仅包含一个C函数的名称,试图让您感到困惑。字符串常量的类型为
char*
,它是指向第一个字符的指针。
(int)
将指针转换为整数。虽然这是实现定义的,但您将获得与字符串printf(实际存储的地址相关的值

因此,您在这里打印一个数字,它恰好是指针转换为
int
的结果

继续:

int d=1;
printf("%d",(int)"printf(" % d);

这里只有一个变化,我添加了空格来说明这一点:从指针转换得到的
int
取模
d
,因此结果是整数除以
d
的余数。因为
d
是一,所以永远不会有余数,任何数字都可以被1除而没有余数结果是
0

这个奖金问题是一个技巧性问题:

printf(“%d”),(int)“printf(“%d”);
解析为

printf(
       "%d",
       ((int)"printf(") % d
      );
字符串
“printf(
转换为
int
并计算模运算。由于
d=1
,模总是
0
。因此
printf
输出
0

第二个调用只打印转换为
int
的字符串的地址,这在不同的环境中会有所不同,甚至在不同的运行中也会有所不同(在我的Mac上)

事实上,转换甚至可能失败并触发特定于实现的行为。因此,在这两种情况下,答案都应该是实现定义的行为

另一个问题应该是:

int d=1;
printf("%d",(int)printf("%d", d));
这会产生
11
。你能解释一下原因吗


请注意,即使是最后一个问题也很棘手:在没有适当原型的情况下调用
printf
,例如,如果
未包含在内,则具有未定义的行为。

这是什么胡说八道?您试图做什么?您在哪里看到的?嗯……什么?首先是打印指针的剩余部分除以
d
。第二是打印指针值。胡说八道。@ThingyWotsit看起来像是模糊C代码竞赛的摘录……这可能是一个有趣的游戏,为什么不呢?
int d=1;
printf("%d",(int)printf("%d", d));