Что нового

Логическая игра

SyDr

Сидра
Сообщения
651
Репутация
158
Предлагаю поиграться :smile: Суть в следующем:

1) Предлагается кусок кода. Чтобы понять, что он делает, запускать его не надо.
2) Задача состоит в том, чтобы узнать, что и почему скрипт выведет в сообщении.
3) Первый, кто объясняет, почему так происходит, может загадывать свою загадку.

На правах автора темы начинаю.
Можете поставить себе оценку по 5-балльной шкале. За точку отсчёта берётся оценка 5. Штрафы:
-1 балл - Редактирование и запуск изменённого кода.
-3 балла - Просмотр справки.

Код:
Opt("MustDeclareVars", 1)
Global $msg = ''
Global $i = 0

$i = Exp(Log(2)*2)

_MsgAppend()
_Test()

MsgBox(4096, Default, $msg)

Func _Test()
	For $i = 1 To 5
		_MsgAppend()
	Next
EndFunc

Func _MsgAppend()
	$msg &= $i
EndFunc
---------------------------
AutoIt v3 Script (2).au3
---------------------------
444444
---------------------------
ОК
---------------------------
Почему в сообщении выводится 444444, а не 412345? :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
это же элементарно, Ватсон :rofl:
ответ писать не буду, т.к. мне лень придумывать свою загадку
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
e в степени Ln(a) равно a. Это вытекает из определения логарифма. Ну а дальше x^(ab) = (x^a)^b, т.е.

e^(Ln(2)*2) = (e^(Ln(2))^2 = 2^2 = 4

Задача. Какой результат выдаст следующий код?

Код:
Hex(BitNOT(BitShift(1, -1)))
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied
Мне кажется ты немного не поянл сути игры. Нужно не разгдать что выдаст код, а предоставить объяснение почему он выдал это.

[?]
Почему в сообщении выводится 444444, а не 412345?
Ответ: Переменная $i в цикле «For...Next» является локальной, а при вызове функции «_MsgAppend» добавляется значение из глобальной переменной $i, т.к подфункция не знает о сущестований этой локальной переменной, ей доступна только глобальная.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):
Переменная $i в цикле «For...Next» является локальной, а при вызове функции «_MsgAppend» добавляется значение из глобальной переменной $i, т.к подфункция не знает о сущестований этой локальной переменной, ей доступна только глобальная.

Ну так это и так понятно, я даже не придал этому значение...

;D
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Yashied [?]
Задача. Какой результат выдаст следующий код?
BitShift с параметром -1 эквивалентен умножению на 2
BitNot($Number) = - ($Number + 1)
Hex возвращает строковое представление числа, преобразованного к шестнадатиричному виду. На число отводится 4 байта.
Таким образом, данная конструкция возвращает строку "FFFFFFFD"

CreatoR [?]
Нужно не разгдать что выдаст код, а предоставить объяснение почему он выдал это.
Угу. Именно так :smile:

Ответ: Переменная $i в цикле «For...Next» является локальной, а при вызове функции «_MsgAppend» добавляется значение из глобальной переменной $i, т.к подфункция не знает о сущестований этой локальной переменной, ей доступна только глобальная.
Конечно :smile:


Yashied [?]
Ну так это и так понятно, я даже не придал этому значение...
А для меня наоборот, такое возведение в степень кажется простым и очевидным :smile:. А то, что For создаёт переменную в локальной области видимости, даже если существует глобальная переменная с таким же именем, сначала не знал. И меня такое поведение функции немного удивляет.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR, поскольку ты разгадал эту задачку, тебе и придумывать следующую.

:whistle:
 
Автор
SyDr

SyDr

Сидра
Сообщения
651
Репутация
158
Внезапно! Это снова я. Это чтобы вы не скучали, пока CreatoR загадку придумывает. Задание почти такое же. Только два сообщения :smile:

Код:
Opt("MustDeclareVars", 1)
Global $msg = ''
Global $i = 0

$i = Exp(Log(2)*2)

_Test()
MsgBox(4096, Default, $msg)
$msg = ''
_Test()
MsgBox(4096, Default, $msg)

Func _Test()
    For $i = 1 To 2
        _MsgAppend()
    Next
EndFunc

Func _MsgAppend()
	Local Static $trap = 'xD?' & @CRLF
	If VarGetType($trap) = 'String' Then
		$trap = Number($trap + 1 And Not $trap)
	Else
		$trap = ''
	EndIf
	$msg &= $i & $trap
EndFunc
 
Верх