【问题标题】:Ternary operator condition issue三元运算符条件问题
【发布时间】:2015-05-20 19:18:10
【问题描述】:
#include<iostream>
int main()
{
  int count = 1;
  while (count <= 5)
  {
    cout<<(count % 2 ? "****" : "++++++++")<< endl;
    ++count;
  }
  system ("pause");
  return 0;
}

我无法理解count%2,条件不应该是count%2==0吗?如果是count%2,编译器怎么知道是真是假?

【问题讨论】:

标签: c++ ternary-operator


【解决方案1】:

在 C++ 中,如果编译器需要一个布尔表达式并找到一个数字类型,它会认为 0 是 false,而其他任何值都是 true。因此,count%2 等价于 count%2 != 0: true 如果奇数。

【讨论】:

  • 谢谢!真的很有帮助!
【解决方案2】:

一切都很简单。阅读一本关于 C++ 或 C++ 标准或其草案的书就足够了。

来自 C++ 标准(4.12 布尔转换)

1 算术纯右值、无范围枚举、指针或 指向成员类型的指针可以转换为 bool 类型的纯右值零值、空指针值或空成员指针值转换为false任何其他值都将转换为 true。对于直接初始化 (8.5),std::nullptr_t 类型的纯右值可以 转换为 bool 类型的纯右值;结果是假的。

因此,如果表达式 count % 2 不等于 0(提示等于 1),则此表达式将转换为 true。否则到false

当然,你可以写成count % 2 != 0,而不是条件中使用的表达式count % 2。然而,正如标准中的引用所说,只需编写 count % 2 就足够了,并且该表达式将在条件中转换为 bool 类型的表达式。

【讨论】:

  • 如果你想用标准来解释这个“简单”的问题,你需要比这更多的标准引号。首先,什么是“prvalue”?什么是“算术类型”?您的报价说“算术类型”的“prvalue”可以转换为布尔值,标准中的哪个规则说转换实际上会在这里发生?
  • @T.C.为了初步了解,阅读这句话就足够了。换句话说,看到来源总是比阅读相同的描述更好。
【解决方案3】:

除 0 以外的所有值都将评估为真。

所以你的"*****" 只会在count % 2 不是0 时打印。 (null 在 Java 中......对不起)

【讨论】:

  • 哦,好吧,这就是为什么我现在很困惑的原因
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 2023-03-03
  • 2012-02-22
  • 2013-04-26
相关资源
最近更新 更多