【问题标题】:If statement without '&&' works? [duplicate]如果没有'&&'的语句有效? [复制]
【发布时间】:2019-04-04 09:44:08
【问题描述】:
int n = 5;    
if(2<=n<=20) 
 {
  cout << "hello";
 }

在上面的代码中,它没有报错,它运行成功并给出“hello”作为输出。

但我们必须在这种等式中使用&amp;&amp;
谁能解释一下?

【问题讨论】:

  • 你能告诉我们n的类型,是int吗?
  • Re: "给出 "hello" 作为输出" -- 对于 n 的某些值,但不限于 [2..20] 范围内的值。试试看。
  • n 是一个整数。

标签: c++ expression-evaluation


【解决方案1】:

&lt;= 在 C++ 中是左关联的,因此表达式被解析为 ((2 &lt;= n) &lt;= 20)2 &lt;= nbool 类型,可以隐式转换为inttrue 转换为1false 转换为0

这两个都是&lt;= 20,因此条件实际上始终为真。


请注意,以上假设nint 或其他原始数字类型。如果n 是一个用户定义的类,其中operator &lt;= 重载,则关联性位仍然为真,但关于隐式转换的部分可能适用也可能不适用,具体取决于该重载运算符的返回类型和语义。

【讨论】:

  • n 是其他一些原始类型,比如double,会有什么变化吗?
  • @Gassa 否,但如果 n 是类类型,它会改变。答案已延长。
  • @Angew:它适用于任何原始类型 n,包括浮点 NaN。
  • @Bathsheba 是的,NaN 仍然是数字类型。它不适用于指针。
  • @Angew:好点。投赞成票。
【解决方案2】:

2&lt;=n&lt;=20 将作为(2&lt;=n)&lt;=20 执行。

2&lt;=n 产生01,具体取决于n 的值。

0&lt;=201&lt;=20 为真,因此cout 将被执行,与n 的值和类型无关。

n 可能是具有重载运算符的类的对象,其中2&lt;=n 会产生某些东西(类的对象或值&gt;21),而&lt;=20 会产生false。在这种情况下,将没有输出。

【讨论】:

  • n的类型无关?我不太确定
【解决方案3】:

你可能是说

if (2 <= n && n <= 20) 

C++和C组2 &lt;= n &lt;= 20(2 &lt;= n) &lt;= 20;子表达式为 0(C++ 中的false)或 1(true),它们都小于或等于 20,因此整个表达式为 1(true)。这对于 any 原始非指针类型 n 是正确的,包括浮点 NaN。

【讨论】:

    【解决方案4】:

    首先评估第一个比较 2 &lt;= n。这将返回 true,它可以转换为 int。来自conv.integral#2

    如果源类型为bool,则值false 转换为0,值true 转换为1。

    一旦true 转换为10,下一个比较是1 &lt;= 200 &lt;= 20,这总是正确的。因此输出。

    【讨论】:

    • Nitpick:2 &lt;= n 也可能是 false
    • @Gassa 一般正确,但在问题中:“[...] 并给出“hello”作为输出”。
    • 在我看来,那是因为第二个比较是真的,而不是第一个。
    • 等等,现在看到了,你当然是对的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2012-03-08
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多