如果没有'&&'的语句是否有效?

时间:2019-04-04 09:44:09

标签: c++ expression-evaluation

rounded = numpy.array((numpy.array(myarray, dtype='datetime64[m]'), dtype='datetime64[ms]')

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

但是我们必须在这种方程式中使用int n = 5; if(2<=n<=20) { cout << "hello"; }
谁能解释一下?

4 个答案:

答案 0 :(得分:12)

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

这两个都是<= 20,因此条件实际上总是成立。


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

答案 1 :(得分:2)

2<=n<=20将作为(2<=n)<=20执行。

2<=n产生01,具体取决于n的值。

0<=201<=20是正确的,因此将执行cout,而与n的值和类型无关。

n可能是带有重载运算符的类的对象,其中2<=n会产生某种结果(对象是类或值>21),与<=20相比结果到false。在这种情况下,将不会有输出。

答案 2 :(得分:1)

您可能是说

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

C ++和C组2 <= n <= 20(2 <= n) <= 20;子表达式为0(在C ++中为false)或1(true),均小于或等于20,因此整个表达式为1(true)。对于任何基本非指针类型n,包括浮点NaN,都是如此。

答案 3 :(得分:0)

首先比较第一个比较2 <= n。这将返回true,可转换为int。来自conv.integral#2

  

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

一旦true转换为10,下一个比较就是1 <= 200 <= 20,这始终是正确的。因此是输出。