以下程序:
int main()
{
printf("%d", '%'%'%');
return 0;
}
产生输出:
0
我想知道这是什么原因。
第二个参数
printf
:
'%'%'%'
更容易理解为:
'%' % '%'
将模运算符
%
应用于字符 '%'
和 '%'
。 因为字符被编码为整数值,所以这与获得数字除以自身的余数相同。
将一个非零数字(可打印字符不能有代码 0)除以它本身总是会得到余数 0,这就是正在打印的内容。
该表达式打印
'%'
除以 '%'
的余数,即 0。这是通过 "%d"
的 printf
说明符打印的值。
字符被编码为 8 位值(以 ASCII 为例),字符常量实际上在 C 中具有
int
类型。
在本例中
'%'
是 37,您正在打印 37 除以 37 的余数。
拥有
'%'%'%'
就相当于拥有 37%37
。
'%'%'%'
是一个故意混淆的表达式,其计算结果为 0
,因为它是 '%'
自身相除的余数。
'%'
是一个字符常量,在 C 中是一个类型为 int
的整数和一个实现定义的值(当前绝大多数系统使用的 ASCII 字符集中的 37
)。由于该值不能为 0
,因此将其除以本身的结果为 1
,余数为 0
,因此代码会打印 0
。
但请注意,为了实现完全可移植性,程序应以换行符结束其输出,并且应通过包含
printf
使用正确的原型来声明 <stdio.h>
函数。
这是修改后的版本:
#include <stdio.h>
int main(void) {
printf("%d\n", '%'%'%');
return 0;
}
以下是同一想法的一些变体:
'-'-'-'
、'^'^'^'
、'<'<'<'
、'>'>'>'
全部评估为 0
。'/'/'/'
和 '='=='='
评估为 1
。'&'&'&'&&'&'&'&'
和 '|'|'|'||'|'|'|'
均评估为 1
。