'%'%'%'是什么意思以及为什么它等于0?

问题描述 投票:0回答:3

以下程序:

int main()
{
    printf("%d", '%'%'%');
    return 0;
}

产生输出:

0

我想知道这是什么原因。

c char modulo
3个回答
7
投票

第二个参数

printf

'%'%'%'

更容易理解为:

'%' % '%'

将模运算符

%
应用于字符
'%'
'%'
。 因为字符被编码为整数值,所以这与获得数字除以自身的余数相同。

将一个非零数字(可打印字符不能有代码 0)除以它本身总是会得到余数 0,这就是正在打印的内容。


2
投票

该表达式打印

'%'
除以
'%'
的余数,即 0。这是通过
"%d"
printf
说明符打印的值。

字符被编码为 8 位值(以 ASCII 为例),字符常量实际上在 C 中具有

int
类型。

在本例中

'%'
是 37,您正在打印 37 除以 37 的余数。

拥有

'%'%'%'
就相当于拥有
37%37


2
投票

'%'%'%'
是一个故意混淆的表达式,其计算结果为
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
© www.soinside.com 2019 - 2024. All rights reserved.