Что на самом деле делает «If a <b <c Then» в vb.net? - PullRequest
2 голосов
/ 31 января 2012

Вот некоторый «плохой» код:

Module test
    Sub Main()
        Console.WriteLine("1<2 =   " + cstr((1<2)))
        Console.WriteLine("2<1 =   " + cstr((2<1)))
        Console.WriteLine("1<2<3 = " + cstr((1<2<3)))
        Console.WriteLine("3<2<1 = " + cstr((3<2<1)))
    End Sub
End Module

Вывод этого:

1<2 =   True
2<1 =   False
1<2<3 = True
3<2<1 = True

1<2<3 Истина, но не по правильным причинам.

3<2<1 также оценивается как True.Почему?

Может кто-нибудь объяснить, что здесь происходит?

Я знаю, что должен использовать a<b and b<c, но я хочу знать, что происходит, когда вы используете последовательные операторы.то есть почему компилятор не плачет !!Используется ли подобный синтаксис для чего-то еще?

Ответы [ 3 ]

9 голосов
/ 31 января 2012

Оценивается слева направо, поэтому 3<2<1 совпадает с (3<2)<1. Поскольку выражение в скобках ложно, все оценивается как 0<1, что верно.

3 голосов
/ 31 января 2012

Прежде всего, с Option Strict On, компилятор плачет. С Option Strict Off вот что происходит:

  • 3 < 2 < 1 оценивается слева направо, поэтому эквивалентно (3 < 2) < 1
  • 3 < 2 оценивается как False, поэтому компилятор оценивает: False < 1
  • VB преобразует логическое значение False в 0, чтобы его можно было сравнить с другим значением типа int
  • 0 < 1 оценивается в True
1 голос
/ 31 января 2012

Это не характерно для какого-либо языка, но a<b<c всегда будет оцениваться как (a<b) < c. Это верно и для всех других операторов. Таким образом, a+b+c всегда будет (a+b) + c.

...