Что нового

Конструкция If $var Then - что она делает?

akoulev

Новичок
Сообщения
166
Репутация
2
Обнаружил у себя один из первых моих скриптов: практически "цельно-тянутый" :whistle: и, даже, неплохо (как думал я) работавший - пока не потребовалясь доработка. Вот тут-то я и понял, что не понимаю, как работает что именно делает конструкция:
Код:
If $var Then

Что характерно, работало оно у меня (как выяснилось) в корне неправильно и не выполняло ту часть функционала, что была мною задумана и на этот скрипт возложена; оно просто работало по принципу "ну хоть как-то" - в связи с чем, через ~полтора года и понадобилась вышеупомянутая доработка.
Хелп - безмолвствует.
Итак, мои версии:
1) Эта конструкция сравнивает $var с нулём?
2) Эта конструкция сравнивает $var с дефолтным значением?
3) Эта конструкция проверяет, есть ли (задана ли) переменная $var в данном скрипте?
4) Ещё что-то?
Ай нид хелп, плиз!





Добавлено:
Сообщение автоматически объединено:

Да, "на всякий пожарный", кусочек кода, где "оно играет":
Код:
do
		$var = Ping("192.168.0.11",5); как там Шелезяка, на месте ли? А на деле - поднялась ли сеть при загрузке (Шелезяка-то - на месте! :) )
			If $var Then ; also possible:  If @error = 0 Then ...
    		Else
    		EndIf
Until @error = 0; Во-во, чтоб ошибок при нашем 'пингаторстве' нэ було!
 

SyDr

Сидра
Сообщения
651
Репутация
158
Читай справку. Обязательно.
Раздел Обзор языка. Типы данных.
По поводу конструкции:
Код:
Если $var То <выполнить код>


Код будет выполнен в следующих случаях:
$var <> 0
$var = True
$var <> "" (не пустая строка)

-------------------------------

Код:
If $var Then ; also possible:  If @error = 0 Then ...
            Else
            EndIf

А это индусский код. Он вообще ничего не делат.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 593
Репутация
938
Вроде бы она сравнивает с нулем. Пример if @error then. Конструкция истинна если @error <> 0
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
SyDr сказал(а):
Читай справку. Обязательно.
Раздел Обзор языка. Типы данных.
Читал. То ли невнимательно; то ли - именно этого там попросту нет.

SyDr сказал(а):
А это индусский код. Он вообще ничего не делает.
Да и не должен: я не стал выкладывать пару килобайт абсолютно никому (кроме меня ;D) не нужного кода, выдрав оставив для расмотрения только один цикл, а в нём оставив только интересующую меня конструкцию.
 

SyDr

Сидра
Сообщения
651
Репутация
158
akoulev [?]
Читал. То ли невнимательно; то ли - именно этого там попросту нет.
Есть:
Если числа используются, как булевы значения, применяются следующие правила:

Только 0 соответствует значению false
Любые другие числа соответствуют значеню true

Пример:
$Number1 = 0
$Boolean1 = true
$Boolean2 = $Number1 and $Boolean1

В результате $Boolean2 равно false

Да и не должен: я не стал выкладывать пару килобайт абсолютно никому (кроме меня ) не нужного кода, выдрав оставив для расмотрения только один цикл, а в нём оставив только интересующую меня конструкцию.
Ну в таком случае, с учётом приведённого кода:
Код, следующий после then будет выполнен в том случае, когда "Шелезяка" пингуется. Иначе будет выполнен код, следующий после Else
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
SyDr сказал(а):
Есть:
Если числа используются, как булевы значения, применяются следующие правила:

Только 0 соответствует значению false
Любые другие числа соответствуют значеню true

Пример:
$Number1 = 0
$Boolean1 = true
$Boolean2 = $Number1 and $Boolean1

В результате $Boolean2 равно false
Спасибо: вот теперь я точно запутался. :rofl:
А причём тут булевы значения? Я так понимаю, тут элементарное ветвление по условию (ну, да - "притянуть за уши" булевость тут можно. Но, имхо, не нужно: ветвление, - и всё, этого и достаточно); суть же вопроса была в том, что конструкция:
Код:
If $var=0 then

ясна и понятна;

а вот её сокращённая сестрица:
Код:
If $var then

не столь прозрачна.
Равносильны ли эти выражения? (Судя по ответу Belfigor - таки да. Или Вы с этим несогласны? Тогда можно попросить Вас привести рабочий пример: максимально простой, - но наглядный?)
Ну в таком случае, с учётом приведённого кода:
Код, следующий после then будет выполнен в том случае, когда "Шелезяка" пингуется. Иначе будет выполнен код, следующий после Else
Ну, это-то понятно (я хоть и безнадёжен, - но всё же, не настолько :laugh:smile:; я просто проиллюстрировал, в каком месте листинга встречается трудновоспринимаемая (мною) форма записи.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
akoulev
В AutoIt - неявное преобразование типов. Там где используются операторы условия, проверяемые операнды преобразуются именно в булевы значения. Причем правило простое - Все что не 0 - True, 0 - False. Если переменная строка, то строка любой длины - True, пустая строка "" - False. Явное указание массива - всегда False.
На самом деле, выражение типа
IF $var = $somenumber Then это ни что иное как If $var Then, так как
$var = $number - это не окончательный результат. Результат это сравнение $var с $number, если равен, то результатом будет True, а если нет, то False. Вот именно с этими двумя булевыми значениями условные операторы и работают.
PS: вот тут и замечается упрощение конструкции по сравнению с другими ЯП, где операции сравнения имеют немного другие обозначения. А в Autoit и операция сравнения на равенство, и операция прсваивания имеет одно и тоже обозначения "=". В Си к примеру, операция сравнения на равенство пишется как "==".
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Думаю после всего сказанного добавить уже нечего. Могу только пересказать своими словами:

Итак, представим ситуацию, когда домой возвращается муж в день зарплаты. Естественно его поджидает жена, которая тут же спрашивает Его, как только муж переступает порог:

Пример 1:
Код:
If $Lukoshko = 1000 Then
     $Muz = "Ночь любви"
Else
     $Muz = "Удар скалкой"
EndIf


Жена спрашивает:
- Принес мне зарплату в 1000 рублей?
- Да дорогая.
=> и муж получает ночь любви.
Если же зарплату муж не приносит или приносит хотя бы на копейку меньше (999,99), то получает
=> удар скалкой!
Кстати, если он на копейку принесет больше, то жена подумает что он вор и так же приложет его скалкой.
Это условие с фиксированным значением. Если же мы напишем так:

Пример 2:
Код:
If $Lukoshko > 0 Then
     $Muz = "Ночь любви"
Else
     $Muz = "Удар скалкой"
EndIf


...то жена будет довольна любой зарплате. А теперь вернемся к Вашему примеру.

Пример 3:
Код:
If $Lukoshko Then
     $Muz = "Ночь любви"
Else
     $Muz = "Удар скалкой"
EndIf


Жена:
- Принес что-нибудь?
Муж:
- Да, палку колбасы! ($Lukoshko = "Палка колбосы")
(ночь любви).
Или так:
- Да, 3 рубля! ($Lukoshko = 3)
(ночь любви)
Или так:
- Да, я принес долг в -3 рубля! ($Lukoshko = -3)
Жена:
Как так?
Муж:
Напали хулиганы, отобрали всю зарплату, я еще должен остался.
Жена:
- Дай я тебя пожалею!
(ночь любви)

Но если Муж скажет:
- Да, я принес 0 рублей ($Lukoshko = 0) -- А это значит лож! (False) Ведь купюр в 0 рублей не бывает! А жена очень не любит когда ее обманывают!
Жена:
- Давай сюда!
Муж:
- Не могу, у меня карман дырявый - они вылетели!
Жена:
.... (Удар скалкой)
Или так:
- Да, я принес Ничего - это тоже ложь, ведь по сути он НИ ЧЕГО не принес! ($Lukoshko = "")
Жена:
.... (Удар скалкой)

Вот это и есть булевы значения. False(ложь) - когда в лукошке ни чего нет, и True(правда) - когда в лукошке что-то лежит. Условное вырожение If ... Then - выполняется только если в лукошке что-то лежит, либо если в лукошке пусто, можно добавить перевертышь Else, тогда условие выполнится по этой ветке.

Фух! Вот и сказочке Конец! Отдаю рассказ на растерзание! ))

Пардон ошибся! If.. Then... выполняется когда "муж" говорит правду о том, что находится в лукошке! Вот ))
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 711
Можно немного усложнить условие, так, в позновательных целях:

Код:
If $Thought = 'Пойти домой' Then
	If $Lukoshko = 1000 Then
		$Muz = "Ночь любви"
	Else
		$Muz = "Удар скалкой"
	EndIf
Else
	$Muz = "Шампанское" & "Ночь любви"
EndIf
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
OffTopic:
Kalisnik
:rofl: 5-ка за рассказ
 

Kalisnik

Эволюция
Сообщения
295
Репутация
63
Ну а как же ElseIf?
Код:
If $Luck = "Если Решко" Then
	If $Thought = 'Пойти домой' Then
		If $Lukoshko = 1000 Then
			$Muz = "Ночь любви"
		Else
			$Muz = "Удар скалкой"
		EndIf
	Else
		$Muz = "Шампанское" & "Ночь любви"
	EndIf
ElseIf $Luck = "Если Орел" Then
	If $Thought = 'Не пойти домой' Then
		If $Lukoshko = 1000 Then
			$Muz = "Друзья" & "Шампанское" & "Прекрассная незнакомка" & "Ночь любви" 
		ElseIf $Lukoshko = 2000 Then
			$Muz = "Друзья" & "Шампанское" & "Шампанское" & "Прекрассная незнакомка"
		ElseIf $Lukoshko = 3000 Then
			$Muz = "Друзья" & "Шампанское" & "Шампанское" & "Ночь любви"
		EndIf
	Else
		$Muz = "Удар скалкой"
	EndIf
Else
	$Lukoshko -= 1
EndIf
 

SyDr

Сидра
Сообщения
651
Репутация
158
Тут уже даже сказочку успели рассказать, ну да ладно. Впихну и я свои 5 копеек.

akoulev [?]
Спасибо: вот теперь я точно запутался.
А причём тут булевы значения?
Как причём? Если <Условие>... Вот условие здесь и имеет булев тип.

If $var=0 then ясна и понятна; а вот её сокращённая сестрица:Код: AutoIt [Выделить]If $var then не столь прозрачна.Равносильны ли эти выражения?
Не равносильны. Они противоположны :smile:
Код:
If $var Then ; равносильно
If $var <> 0 ; если $var число
If $var <> "" ; если $var строка
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Конструкция
Код:
If $var = 0 Then

равносильна
Код:
If Not $var Then
 
Верх