字符串中的 %a 读取为内存中的一个点

`% a` in string reads as a point in memory

我在演示表达式行为的小程序中使用以下代码:

c = a % b;
d = b % a;
printf("\nc = a % b\n"
       "d = b % a\n"
       "  a = %d\n"
       "  b = %d\n"
       "  c = %d\n"
       "  d = %d\n\n",
       a, b, c, d);

输出如下:

c = a % b
d = b  0x0.0000000000008p-1022
  a = 5
  b = 7
  c = 5
  d = 2

我已经尝试转义字符串中的模运算符而不改变输出:

c = a % b;
d = b % a;
printf("\nc = a \% b\n"
       "d = b \% a\n"
       "  a = %d\n"
       "  b = %d\n"
       "  c = %d\n"
       "  d = %d\n\n",
       a, b, c, d);

我想知道的是:当 % b 按预期输出字符串时,为什么 % a 似乎指向内存中的某个位置?此外,为什么转义模数符号不能解决问题?

编辑(已解决):

感谢大家的评论和回答;我能够从您的回复中找到完整的详细信息。

此问题与以下问题重复,可参考以获取更多信息:

白色 space 在 % 之后被忽略,printf 将使用下一个非白色 space 字符来标识转换说明符。这没有影响 "c = a % b" 的原因是因为 %b 不是有效的转换说明符。

之所以必须使用%%转义%符号是因为%这里的用法是printf特有的,必须遵循printf的转义规则,不同来自继承自 C.

\ 的转义规则

要转​​义格式字符串中的符号“%”,您需要像这样将其加倍

printf("\nc = a %% b\n"