Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Разница между операторами равенств ( =, ==, <> ) (http://forum.oszone.net/showthread.php?t=207416)

Freez 23-05-2011 18:22 1681188

Разница между операторами равенств ( =, ==, <> )
 
Столкнулся со следующей проблемой:

Код:

while 1
        $messagesListElementState = GUICtrlRead ($messagesList, 1);Какой элемент сейчас выбран
        $messagesListElementStateTextTemp = $messagesListElementStateText
        $messagesListElementStateText = GUICtrlRead ($messagesListElementState$messagesListElementState, 1);Текст выбранного эл-та
        if Not ($messagesListElementStateText == $messagesListElementStateTextTemp) Then
                showMessage ($messagesList, $messageEditLabel)
        EndIf
wend

Смысл цикла - считываем номер текущего элемента, считываем текст из него, сравниваем с временной переменной (текст активного элемента в прошлый проход), если они не равны - делаем действия.
Изначально у меня условие вместо
Код:

if Not ($messagesListElementStateText == $messagesListElementStateTextTemp) Then
выглядело так:
Код:

if $messagesListElementStateText <> $messagesListElementStateTextTemp then
При этом, условие не отрабатывалось (меняется активный эл-т, меняется текст, а сравнение через <> выдает false - т.е., как я понимаю, элементы якобы равны)



Резюмирую: в случае, когда messagesListElementStateTextTemp = 0, а messagesListElementStateText = 'Привет' сравнение через not ( == ) дало True, а через <> - False.
Как так?

Creat0R 23-05-2011 19:46 1681240

Зачем так усложнять?

Чтобы ответить на поставленный вопрос, желательно увидеть полный пример.
Хотя думаю дело в сравнений разных типов данных.

AZJIO 23-05-2011 19:54 1681247

Freez,
<> не учитывает регистр букв, как и =
== - учитывает регистр букв

Creat0R 23-05-2011 19:55 1681248

Цитата:

Цитата Freez
в случае, когда messagesListElementStateTextTemp = 0, а messagesListElementStateText = 'Привет' сравнение через not ( == ) дало True, а через <> - False. »

Для AutoIt 0 это тоже самое что и ''.

«==» это не тоже самое что и «=», второе применение сравнивает типы данных как строки, а первое по отдельности, пример:

Код:

$vVar1 = 0
$vVar2 = ''

ConsoleWrite(($vVar1 = $vVar2) & @LF) ;True - так как при использований "=", переменная $vVar1 принимается как пустая строка, чему и равняется $vVar2
ConsoleWrite(($vVar1 == $vVar2) & @LF) ;False - так как при использований "==", переменная $vVar1 принимается как 0 (целое число), чему НЕ равняется $vVar2

Цитата:

Цитата AZJIO
<> не учитывает регистр букв, как и =
== - учитывает регистр букв »

Верно, но в данном случае немного другая ситуация.

AZJIO 23-05-2011 20:17 1681267

Creat0R, просто сравниваеть результаты инвертирования выражения, которые имеют разные свойства уже не логично, это я и показал.
Freez, посмотри примеры логических выражений.

Creat0R 23-05-2011 22:38 1681375

Цитата:

Цитата AZJIO
просто сравниваеть результаты инвертирования выражения, которые имеют разные свойства уже не логично, это я и показал. »

Но Freez же не знает, будут ли они разными, он сравнивает значения из List'а.
И ты показал про регистр букв, тут нет связи с регистром, здесь вопрос именно в сравнений типов данных. Это обсуждалось немало на оф. форуме.

Freez 24-05-2011 12:36 1681648

Creat0R, с типами данных - это понятно. Вопрос в следующем:

Код:

If  '' = 'Привет'  Then
        ConsoleWrite ('Пустое место равно Привету')
EndIf

Код:

If  0 = 'Привет'  Then
        ConsoleWrite ('Ноль равен Привету')
EndIf

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

If  '' = 0  Then
        ConsoleWrite ('Пустое место равно нулю')
EndIf

На практике же, первое выражение дает False (логично), а второе - True (каким образом??)

Сначала я было подумал, что через " = " любая строка равна любому числу, однако (false):
Код:

If  '' = 1  Then
        ConsoleWrite ('Пустое место равно единице')
EndIf

Таким образом получается, что " = " истина для любой строки и нуля? ( ('anyString' = 0) - true )
Какой в этом смысл?

Creat0R 24-05-2011 13:16 1681666

Цитата:

Цитата Freez
с типами данных - это понятно »

Если было бы понятно, то не возникало бы последующих вопросов.

Цитата:

Цитата Freez
по логике вещей, эти условия должны быть равнозначны »

Это почему?
В данном случае (второй пример сверху) оба типа данных преобразовываются в целое число, почему - потому что так устроен AutoIt, он работает только с одним типом данных - Variant.
В первом же примере, оба типа являются строковыми, поэтому и нет совпадения.

Цитата:

Цитата Freez
Таким образом получается, что " = " истина для любой строки и нуля? »

«If '' = 0 Then» это тоже самое что и «If Int('') = Int(0) Then».

Freez 24-05-2011 13:19 1681668

Creat0R, ага, спасибо, теперь совсем понятно ))


Время: 06:52.

Время: 06:52.
© OSzone.net 2001-