if(i<2 && i>10){
//code here will never be reached or what?
}
只是在整数溢出的情况下?
答案 0 :(得分:1)
编辑:我写了这个,不知道c#是使用的语言。我曾经使用过C ++,但我相信该原理也适用于c#。
i
为volatile
的情况下,i
的值可能在i<2
和i>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; } }
否则,如果多线程处理(如果在比较之间i
的值发生更改)也可能发生,除非您应用正确的锁定