Войти

Показать полную графическую версию : [решено] Разница между операторами равенств ( =, ==, <> )


Freez
23-05-2011, 18:22
Столкнулся со следующей проблемой:

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
Зачем так усложнять?

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

AZJIO
23-05-2011, 19:54
Freez,
<> не учитывает регистр букв, как и =
== - учитывает регистр букв

Creat0R
23-05-2011, 19:55
в случае, когда messagesListElementStateTextTemp = 0, а messagesListElementStateText = 'Привет' сравнение через not ( == ) дало True, а через <> - False. »
Для AutoIt 0 это тоже самое что и ''.

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

$vVar1 = 0
$vVar2 = ''

ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)(($vVar1 = $vVar2) & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf)) ;True - так как при использований "=", переменная $vVar1 принимается как пустая строка, чему и равняется $vVar2
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)(($vVar1 == $vVar2) & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf)) ;False - так как при использований "==", переменная $vVar1 принимается как 0 (целое число), чему НЕ равняется $vVar2

<> не учитывает регистр букв, как и =
== - учитывает регистр букв »
Верно, но в данном случае немного другая ситуация.

AZJIO
23-05-2011, 20:17
Creat0R, просто сравниваеть результаты инвертирования выражения, которые имеют разные свойства уже не логично, это я и показал.
Freez, посмотри примеры (http://azjio.ucoz.ru/publ/if_else_endif/6-1-0-28) логических выражений.

Creat0R
23-05-2011, 22:38
просто сравниваеть результаты инвертирования выражения, которые имеют разные свойства уже не логично, это я и показал. »
Но Freez же не знает, будут ли они разными, он сравнивает значения из List'а.
И ты показал про регистр букв, тут нет связи с регистром, здесь вопрос именно в сравнений типов данных. Это обсуждалось немало на оф. форуме.

Freez
24-05-2011, 12:36
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
с типами данных - это понятно »
Если было бы понятно, то не возникало бы последующих вопросов.

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

Таким образом получается, что " = " истина для любой строки и нуля? »
«If '' = 0 Then» это тоже самое что и «If Int('') = Int(0) Then».

Freez
24-05-2011, 13:19
Creat0R, ага, спасибо, теперь совсем понятно ))




© OSzone.net 2001-2012