[решено] Разница между операторами равенств ( =, ==, <> )

Ответить
Аватара пользователя
Freez

[решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Freez »

Столкнулся со следующей проблемой:





Код:

Код: Выделить всё

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

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Creat0R »

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



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

Хотя думаю дело в сравнений разных типов данных.
Аватара пользователя
AZJIO

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение AZJIO »

Freez,

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

== - учитывает регистр букв
Аватара пользователя
Creat0R

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Creat0R »

Цитата 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

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение AZJIO »

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

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

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Creat0R »

Цитата AZJIO:



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




Но Freez же не знает, будут ли они разными, он сравнивает значения из List'а.

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

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Freez »

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

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Creat0R »

Цитата Freez:



с типами данных - это понятно
[решено] Разница между операторами равенств ( =, ==, <> )




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




Цитата Freez:



по логике вещей, эти условия должны быть равнозначны
[решено] Разница между операторами равенств ( =, ==, <> )




Это почему?

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

В первом же примере, оба типа являются строковыми, поэтому и нет совпадения.




Цитата Freez:



Таким образом получается, что " = " истина для любой строки и нуля?
[решено] Разница между операторами равенств ( =, ==, <> )




«If '' = 0 Then» это тоже самое что и «If Int('') = Int(0) Then».
Аватара пользователя
Freez

Re: [решено] Разница между операторами равенств ( =, ==, <> )

Сообщение Freez »

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

Вернуться в «AutoIt»