Что нового

Типы переменных

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Если не сложно, объясните мне, пожалуйста, почему при умножении числа на себя возвращается тип Int32, а при возведении его же в квадрат - Double ?
Код:
$i = 10
$iInt32 = $i * $i
$iDouble = $i ^ 2
ConsoleWrite($iInt32 & @TAB & VarGetType($iInt32) & @LF);Int32
ConsoleWrite($iDouble & @TAB & VarGetType($iDouble) & @LF);Double
 

Yashied

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

Грубо говоря,

Код:
DllCall(..., 'float', ...)


Всегда будет возвращать вещественный тип, а

Код:
DllCall(..., 'int', ...)


целочисленный.

Кстати, из этого вывод: $i * $i быстрее, чем $i ^ 2.
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied
Получается, что AutoIt постепенно отходит от неопределенного типа переменных? И в 3.3.8.0 это уже частично реализовано. Или я не прав?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
IMHO Следовательно, нужно приводить переменные к нужному типу, если в коде это актуально.
Код:
$i = 10
$iInt32_1 = Int($i*$i)
$iInt32_2 = Int($i^2)
ConsoleWrite($iInt32_1 & @TAB & VarGetType($iInt32_1) & @LF);Int32
ConsoleWrite($iInt32_2 & @TAB & VarGetType($iInt32_2) & @LF);Int32
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
И тогда еще мне непонятен смысл функции IsInt(). И в 3.3.6.1., и в 3.3.8.0 она возвращает 1. :
Код:
$i = 10
$iInt32 = $i * $i
$iDouble = $i ^ 2
ConsoleWrite($iInt32 & @TAB & VarGetType($iInt32) & @TAB & IsInt($iInt32) & @LF);Int32
ConsoleWrite($iDouble & @TAB & VarGetType($iDouble) & @TAB & IsInt($iDouble) & @LF);Double
If $iInt32 = $iDouble Then
	ConsoleWrite('$iInt32 = $iDouble' & @LF) ;Почему???
Else
	ConsoleWrite('$iInt32 <> $iDouble' & @LF)
EndIf

Garrett,
нужно приводить переменные к нужному типу, если в коде это актуально.
А как об этом узнать, какие типы нужны, если я уже привык к
Код:
$i = 121
ConsoleWrite($i & @TAB & IsNumber($i) & @TAB & VarGetType($i) & @LF)
$i = '121'
ConsoleWrite($i & @TAB & IsString($i) & @TAB & VarGetType($i) & @LF)
; и т.д.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
madmasles сказал(а):
Получается, что AutoIt постепенно отходит от неопределенного типа переменных? И в 3.3.8.0 это уже частично реализовано. Или я не прав?

Не правы. Возведение в степень всю жизнь давало вещественный тип. Просто они изменили функцию Hex(), в частности, в справке написано:

Numbers passed as non-integers (those with decimal separator or exponent) are processed as doubles.

Но, видимо, не совсем удачно.

Раньше Hex() воспринимала только целочисленные значения (Int32), и, следовательно, автоматом приводила входной тип к Int32. Сейчас X3 знает что.

Можете использовать _WinAPI_Hex64().

:smile:


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

IsInt(), IsFloat() и т.д. проверяют не тип переменной (для этого есть VarGetType()), а ее значение.
 
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Yashied [?]
Возведение в степень всю жизнь давало вещественный тип.
Если бы я это знал, то и тему не создавал бы. :'(

OffTopic:
С каждым днем (месяцем, годом) убеждаюсь, как много я не знаю... :(
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Автор
madmasles

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett [?]
Кстати, я порой наступал на эти "грабли"
Аналогично. :smile:
Только я до сих пор на них наступаю иногда. ;D


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

Garrett [?]
Думаю только проверкой VarGetType.
Ага, и еще теперь тщательным вычитыванием справки, что там еще поменяют...



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

Yashied [?]
Можете использовать _WinAPI_Hex64()
Как всегда, безупречно, что на 3.3.6.1, что на 3.3.8.0
Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $Value = 255 ^ 2 + 255 * 2

ConsoleWrite('DEC: ' & $Value & @CR)
ConsoleWrite('HEX: 0x' & _WinAPI_Hex64($Value, 4) & @CR)
Чтобы мы без Вас делали...
Спасибо!!! :thanks:
 
Верх