i <2 && i> 10处是否有整数i?

时间:2019-01-31 09:51:21

标签: c# numbers integer int integer-overflow

if(i<2 && i>10){
    //code here will never be reached or what?
}

只是在整数溢出的情况下?

2 个答案:

答案 0 :(得分:1)

编辑:我写了这个,不知道c#是使用的语言。我曾经使用过C ++,但我相信该原理也适用于c#。

  • 没有单个整数可以满足条件
  • 编译器可以很好地优化if条件的主体(请参见此处的example on compiler explorer
  • 但是,在ivolatile的情况下,i的值可能在i<2i>10测试之间改变。在这种情况下,可以到达if身体。

但是,尽管从理论上讲可能是有可能的,但这并不是故意的。

这是我的示例代码

#include <iostream>
using std::cout;

void foo(int i)
{
    if (i < 2 && i > 10)
    {
        cout << "The impossible happened in foo\n";
    }
}

void bar(volatile int i)
{
     if (i < 2 && i > 10)
    {
        cout << "The impossible happened in bar\n";
    }
}

答案 1 :(得分:1)

某些c#确实有可能(假设c#是因为被标记了...即使被标记也没有假设整数是因为右侧比较仍然是整数,所以它与标记匹配!;-))成if ...采取:

public class Foo {
   public static bool operator> (Foo a, int b) {
       return true;
   }
   public static bool operator< (Foo a, int b) {
       return true;
   }
}

然后:

Foo i = new Foo();
if(i<2 && i>10){
  Console.WriteLine("Pass!");
}

猜输出吗? Check it out here

另一种方式,没有额外的类或运算符重载:

private static bool odd;
public static int i { get { odd = !odd; return odd ? 1 : 11; } }

Check it out

否则,如果多线程处理(如果在比较之间i的值发生更改)也可能发生,除非您应用正确的锁定