Есть ли целое число i, где i <2 && i> 10? - PullRequest
0 голосов
/ 31 января 2019
if(i<2 && i>10){
    //code here will never be reached or what?
}

На случай целочисленного переполнения, может быть?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Это действительно возможно для некоторого 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!");
}

Угадайте вывод? Проверьте это здесь

Другой способ, без лишних классов или перегрузки операторов:

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

Проверьте это

В противном случае это также может произойти, если многопоточность (если значение i изменяется между сравнениями), если вы не примените правильную блокировку

0 голосов
/ 31 января 2019

Редактировать: я написал это, не зная, что c # - используемый язык.Я использовал C ++, но я считаю, что этот принцип также действителен для c #.

  • нет единственного целого числа, которое удовлетворяет условию
  • , компилятор вполне может оптимизировать телоусловие if (см. здесь пример в проводнике компилятора )
  • однако в случае 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";
    }
}
...