Что нового

Вопрос по условиям и типам переменных

mef-t

Осваивающий
Сообщения
306
Репутация
30
Добрый день.

В нижеследующем коде цикл бесконечный.
Просьба объяснить причину.
P.S. Я предполагаю, что переменная сравнивается не с числом, а с булевым значением. В этом случае в каких условиях текстовая переменная принимает значение "ложь" и "правда"

Код:
$t = 'текст'

While $t = '' Or $t = 0
	ConsoleWrite('непрерывный цикл' & @CRLF)
WEnd
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Нашел описание:
"Только пустая строка ("") соответствует булевому значению False
Любая другая строка (в том числе и "0", "False") соответствует булевому значению True"

Просьба подсказать, по какой причине данная переменная воспринимается как булевая, а не как текстовая. Ведь изначально у переменной уже есть текстовое значение.

P.S. Результаты следствия мне понятны. Мне не понятна причина. Хочу понять причину, чтобы в будущем не нарваться на подобные нюансы.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
mef-t [?]
Просьба подсказать, по какой причине данная переменная воспринимается как булевая, а не как текстовая.
Видимо так приняли, что переменная содержащая текст при сравнении с числом (ваш случай $t = 0) "конвертируется" в 0 и наоборот.
Поэтому это тоже работает:
Код:
If 'aaa' = 0 Then
	ConsoleWrite('Верно' & @CRLF)
EndIf

Обычно это не мешает, но надо быть осторожным в таких ситуациях:
Код:
Switch 'test'
	Case 0
		ConsoleWrite('Вы получите это условие' & @CRLF)
	Case 'test'
	Case Else
EndSwitch

Switch 0
	Case 'test'
		ConsoleWrite('Вы получите это условие' & @CRLF)
EndSwitch

чтобы в будущем не нарваться на подобные нюансы
Что бы в будущем обезопасить себя от неприятностей - не сравнивайте разные типы между собой.
Или используйте преобразование:

*ни одно условие не выполнится
Код:
If String(0) = '' Then
	ConsoleWrite('не подойдет' & @CRLF)
EndIf

If 'test' = String(0) Then
	ConsoleWrite('не подойдет' & @CRLF)
EndIf


Или для сравнения используйте == (но тут будет учитываться регистр!!)

Код:
If '' == 0 Then
	ConsoleWrite('не подойдет' & @CRLF)
EndIf
If 'test' == 0 Then
	ConsoleWrite('не подойдет' & @CRLF)
EndIf
If 'test' == '0' Then
	ConsoleWrite('не подойдет' & @CRLF)
EndIf
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Спасибо.
Все подробно.

inververs сказал(а):
не сравнивайте разные типы между собой.
Суть в том, что я в условии указывал не переменную, а функцию, которая могла вернуть как текстовый результат, включая пустое значение, так и 0 (в случае ошибки). От сюда и проблемы с вопросами.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
inververs
Видимо так приняли
Если строка используется как число, происходит скрытый вызов функции Number.
Похоже, данное утверждение верно не только при арифметических операциях, но и при сравнениях.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Да, точно, забыл.

Код:
If '123aaa' = 123 Then
	ConsoleWrite('+ Сработает' & @CRLF)
EndIf
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
mef-t
В русской справке Операторы
а при сравнении числа и строки, строка конвертируется в число по правилу функции Number)
По ссылке в Number описывается правило конвертирования.
В англ. справке это не объясняется, так как воспринимается что ты профессионал и не сравниваешь несравниваемые типы (тёплое с мягким). То есть если ты работаешь с текстом, то тебе это известно, и перед тем как начать сравнивать ты должен привести число к нужному типу. Но если же прелесть в автоматических приведении типов к нужному, то неплохо бы и описать правило приоритетов. Если сравниваешь с булевым, то текст конвертируется в булево по принципу False = "пустая строка", в остальных случаях True. Для чисел False = 0, остальные положительные и отрицательные равны True. Перевод в булево прост как 3 копейки по сравнению с "текст в число". Все операторы сравненияя так работают, а не только "=", но кроме "==".
 
Верх