【问题标题】:Is there an integer i where i<2 && i>10?是否存在 i<2 && i>10 的整数 i?
【发布时间】:2019-01-31 09:51:21
【问题描述】:
if(i<2 && i>10){
    //code here will never be reached or what?
}

也许是整数溢出?

【问题讨论】:

  • 该代码永远不会到达,因为数字不能小于 2 且大于 10
  • 导致这个问题的真正问题是什么?为什么你会怀疑逻辑上不可能发生的事情?某些现有代码中是否存在使条件看起来为真的错误?也许你应该问这个问题。请阅读how to ask good questionsthis question checklist。当然不要忘记如何创建minimal reproducible example
  • 我试图理解早期开发人员的代码,并且在不理解的情况下更改它可能会破坏其中的一些逻辑。我发现这只是一个错误,目的是检查 i 是否在 2 和 10 的范围内,所以它的意思是 if(2
  • 这是什么语言?
  • 这是 c# @PaulFloyd

标签: c# numbers integer int integer-overflow


【解决方案1】:

编辑:我写这篇文章并不知道 c# 是使用的语言。我用过C++,但我相信这个原理对c#也是有效的。

  • 没有满足条件的单个整数
  • 编译器可能会优化掉 if 条件的主体(请参阅此处以获取 example on compiler explorer
  • 然而,在ivolatile 的情况下,i 的值可能会在i&lt;2i&gt;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";
    }
}

【讨论】:

  • 是的,在 C# 中多线程时确实有可能发生这种情况,但如果 i 是方法的参数,则永远不会发生(如果 i 是它所包含的类的属性,则可能发生这种情况例如)
【解决方案2】:

确实有可能某些 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 的值在比较之间发生变化)也可能发生这种情况,除非您应用正确的锁定

【讨论】:

  • 好的,所以当重载运算符时,它可以与那个操作一起工作 :)
  • 是的,我只是添加了一种无需额外类或重载就可以通过的方式......而且还有多线程的可能性......有多种奇怪的方式可能会发生
猜你喜欢
  • 2019-04-26
  • 2021-06-09
  • 1970-01-01
  • 2020-05-24
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2013-04-23
相关资源
最近更新 更多