【问题标题】:Why does 'std::cout << !+2 ' output 0?为什么 'std::cout << !+2 ' 输出 0?
【发布时间】:2018-08-06 02:55:04
【问题描述】:

这行代码输出0:

std::cout << !+2;

我认为应该是35,因为'!' ASCII 码为33,加上2 等于35。

为什么会这样?

【问题讨论】:

  • std::cout &lt;&lt; ('!' + 2)?看看我是怎么引用感叹号的?裸露的感叹号是 NOT 运算符,它将否定 +2 的真值,即 false,当转换为整数时为 0。
  • 不,std::cout
  • 您需要做的第一件事是弄清楚表达式!+2 的作用。提示——它不会做你认为它做的事情。
  • @HenriMenke 正确谢谢

标签: c++


【解决方案1】:

让我们快速分析一下你的代码!+2 做了什么。裸感叹号是逻辑非运算符,它否定其操作数的真值。整数,例如+2 可以转换为布尔值,其中0 表示false 和每个非零整数true。这意味着!+2 被转换为!true。 true的否定显然是false,所以!+2转换为false。当您将此布尔值通过管道传递到std::cout 时,它会再次转换为整数,即true 变为1,false 变为0。这就是为什么你 std::cout &lt;&lt; !+2; 打印 0。

您想要做的(将 2 加到 ASCII 代码中!)也可以实现。因此,您必须告诉编译器您需要字符 !,方法是将其括在单引号中。然后代码 std::cout &lt;&lt; ('!' + 2); 将按预期打印 35。我添加了一些额外的括号以不完全依赖运算符优先级。

#include <iostream>

int main() {
    std::cout << ('!' + 2) << '\n';
}

输出:

35

Live on Wandbox

【讨论】:

  • "+2" +sign 也将转换为二进制如果是负号 -0 它应该返回 1
  • @Subodh 在整数中没有-0 这样的东西。
  • @Subodh 浮点数(例如float 和double)能够编码-0.0 与+0.0,但整数类型(例如int)不能。虽然,你可以写-0,但结果是0。因此,!-0 == !0 == 1。 Live Demo on coliru
  • 一元加号不是用于转换为二进制,而是用于promoting the type to int
【解决方案2】:

如果要获取感叹号的ASCII值,需要用单引号括起来,如下所示。

std::cout << '!' + 0;

你所做的是否定一个值(这个值可以是 True 或 False)。将值(此处为整数)设为正数或负数都没有关系(此处您明确指定 2 为正数),因为除零以外的所有值都表示 True。所以,如果你对零做同样的事情,就像下面一样,你会得到 1 作为输出。

std::cout << !+0;

【讨论】:

  • 注意'!'是一个字符常量;它的值由正在使用的字符编码决定。现在几乎总是 ASCII,但它不需要是 ASCII,而且有些系统不是。
  • 实际上,由于它是文字,编译器会使用目标字符编码(-fexec-charset 或 /execution-charset)发出它,这不太可能是 ASCII(但很可能是等价的ASCII 为常用字符)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2011-10-24
相关资源
最近更新 更多