【问题标题】:What does '%'%'%' mean and why is it equal to 0?'%'%'%'是什么意思,为什么等于0?
【发布时间】:2020-06-23 19:38:02
【问题描述】:

以下程序:

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

产生输出:

0

我想知道这是什么原因。

【问题讨论】:

  • 你想做什么?
  • 你知道%运算符是做什么的吗?
  • 你认为 37 除以 37 后的余数是多少?因为这就是您要打印的内容。
  • 感谢阿德里安,我只是没有看到我们在字符之间进行操作
  • 这个问题的-4率太苛刻了。我看到垃圾邮件问题的比率更高。现在,这不是世界上更深层次和节省时间的问题(从开发人员搜索 SO 解决方案的角度来看),但它既清晰又棘手(它偷走了我一个微笑)。

标签: c char modulo


【解决方案1】:

printf的第二个参数:

'%'%'%'

更容易理解为:

'%' % '%'

将模运算符% 应用于字符'%''%'。因为字符被编码为整数值,这与将数字除以自身的余数相同。

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

【讨论】:

  • 谢谢..我没想到我们在两个字符之间进行操作,现在一切都清楚了!
  • @omEchan 你可以在char 类型上使用% 运算符,因为它是一个整数类型。但是,这样的字符不是char类型,它们无论如何都是int类型,这是一个常见的误解,即字符必须是char
  • 字符被编码为 8 位值(如果使用 ASCII)。字符 constants 在 C 中具有 int 类型。细微的区别。
  • @AdrianMole:如果你想准确一点,字符被编码为CHAR_BIT 值。 ;-)
【解决方案2】:

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

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

在这种情况下,'%' 是 37,您正在打印 37 除以 37 的余数。

拥有'%'%'%' 等同于拥有37%37

【讨论】:

  • 我知道模是什么......我的问题在于理解令人困惑的语法
  • @omEchan,字符有一个数字表示,在这种情况下'%'在ASCII中是37,所以如果你将37除以37,剩下的就是0。
  • @AdrianMole:另一方面,我不希望从这个问题中发现这些知识。 Stack Overflow 积累了大量不易搜索的问题和答案。所以问题和答案可能没有什么价值,但那是因为它们是不可发现的,而不是因为知识实际上没有价值。我希望看到 Stack Overflow 重定向或组织基本问题,并找到一些方法来专注于其他地方不太容易回答的问题。
【解决方案3】:

'%'%'%' 是一个故意混淆的表达式,其计算结果为 0,因为它是 '%' 自身除法的余数。

'%' 是一个字符常量,它在 C 中是一个整数,类型为 int 和一个实现定义的值(37 在当前绝大多数系统上使用的 ASCII 字符集中)。由于该值不能为0,因此将其除以自身的计算结果为1,余数为0,因此代码打印0

但请注意,为了实现完全可移植性,程序应以换行符结束其输出,并且应通过包含 <stdio.h> 使用正确的原型声明 printf 函数。

这是修改后的版本:

#include <stdio.h>

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

以下是同一想法的一些变体:

  • '-'-'-''^'^'^''&lt;'&lt;'&lt;''&gt;'&gt;'&gt;' 都计算为0
  • '/'/'/''='=='=' 评估为 1
  • '&amp;'&amp;'&amp;'&amp;&amp;'&amp;'&amp;'&amp;''|'|'|'||'|'|'|' 都计算为 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-07
    • 2018-09-10
    • 2011-05-25
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多