Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Флейм (http://www.flasher.ru/forum/forumdisplay.php?f=53)
-   -   Вопрос Навскидку (http://www.flasher.ru/forum/showthread.php?t=207647)

in4core 28.04.2014 16:15

Вопрос Навскидку
 
Делать было нечего, дело было вечером...

Зашел я как то на один англоязычный ресурс пройти тестирование по AS3 - стало интересно насколько я нуб нубистый. И вот пожалуйста навскидку вопрос *что не так в коде* :

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , if ( c == 10 ) d = false;

Мне вот интересно, скажите по честному , сколько из вас посмотрев данный код , подумав пару секунд - сразу сказали, что цикл не будет выполнен вообще? ( бесконечный ) . Каюсь - пока сам не проверил, не поверил, что это так. Да понятно - это все специфическая часть языка, но пипец такие вещи всегда помнить, хотя наверное это связано с тем, что number я редко использую в своих проектах, но все же было обидно ответить не верно на простейший код из 2х строк

alexcon314 28.04.2014 16:49

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , if ( c == 10 ) d = false;

Подумав пару секунд, я засоменевался, что это вообще скомпилится.
Изюм не только в Number, но и в , (оператор запятая).

ZackMercury 28.04.2014 16:51

Мне кажется, должно скомпилиться
Только вот так
Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )
{
        c += 0.1 ;
        if ( c >= 10 ) d = false;
}

Добавлено через 4 минуты
Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )
{
        c += 0.1 ;
        if ( c >= 10 ) d = false;
        trace(c);
}

Код:

0.1
0.2
0.30000000000000004
0.4
0.5
0.6
0.7
0.7999999999999999
0.8999999999999999
0.9999999999999999
1.0999999999999999
1.2
1.3
1.4000000000000001
1.5000000000000002
1.6000000000000003
1.7000000000000004
1.8000000000000005
1.9000000000000006
2.0000000000000004
2.1000000000000005
2.2000000000000006
2.3000000000000007
2.400000000000001
2.500000000000001
2.600000000000001
2.700000000000001
2.800000000000001
2.9000000000000012
3.0000000000000013
3.1000000000000014
3.2000000000000015
3.3000000000000016
3.4000000000000017
3.5000000000000018
3.600000000000002
3.700000000000002
3.800000000000002
3.900000000000002
4.000000000000002
4.100000000000001
4.200000000000001
4.300000000000001
4.4
4.5
4.6
4.699999999999999
4.799999999999999
4.899999999999999
4.999999999999998
5.099999999999998
5.1999999999999975
5.299999999999997
5.399999999999997
5.4999999999999964
5.599999999999996
5.699999999999996
5.799999999999995
5.899999999999995
5.999999999999995
6.099999999999994
6.199999999999994
6.299999999999994
6.399999999999993
6.499999999999993
6.5999999999999925
6.699999999999992
6.799999999999992
6.8999999999999915
6.999999999999991
7.099999999999991
7.19999999999999
7.29999999999999
7.39999999999999
7.499999999999989
7.599999999999989
7.699999999999989
7.799999999999988
7.899999999999988
7.999999999999988
8.099999999999987
8.199999999999987
8.299999999999986
8.399999999999986
8.499999999999986
8.599999999999985
8.699999999999985
8.799999999999985
8.899999999999984
8.999999999999984
9.099999999999984
9.199999999999983
9.299999999999983
9.399999999999983
9.499999999999982
9.599999999999982
9.699999999999982
9.799999999999981
9.89999999999998
9.99999999999998
10.09999999999998


alexcon314 28.04.2014 17:15

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while (  c += 0.1 , d ) if ( c >= 10 ) d = false;
trace(c);


in4core 28.04.2014 17:22

С запятой, я просто сократил, это не суть. Сама суть была в number. alexcon314 А как сдеолать так, чтобы цикл был небесконечный - проблем нет. Я именно конкретизировал суть - что помнить, что при += 0.1 будут запредельные числа никогда не достигающие целого 10

toFL 28.04.2014 17:30

Цитата:

что при += 0.1 будут запредельные числа никогда не достигающие целого 10
Это во многих языках бывает, as3 тут ни причем.

in4core 28.04.2014 17:37

Я не против. Так и никто не ответил на мой вопрос : посмотрев код ( и не читая комменты ), вы все сразу поняли, что цикл не выполнится из за того, что Number так работает, или нет ?

toFL 28.04.2014 17:46

Первое, на что обратил внимание это на символ , . Второе, что c может ровняться 10 а может и нет.

Добавлено через 4 минуты
Тут варианта два:
Код AS3:

if ( int(c) == 10 )

или
Код AS3:

if ( c == 10.0 )

В первом случае, конечно же все будет работать, но второй правильнее (если бы FPU работал честно), т.к. хороший тон сравнивать дробное с дробным.
Хотя Flash Runtime все равно оптимизирует этот код и преобразует 10.0 в 4х байтный int, а жаль. Следовательно 10.0 имеет смысл только в Java, C++ и т.п. :)

P.S. в C++ это 10.0f

Aquahawk 28.04.2014 17:52

Хорошее понимание языка это оторвать руки за такую конструкцию.

in4core 28.04.2014 18:21

Aquahawk - к чему это ты? Это вопрос теста, там могло быть написано хоть *опа* - это не важно, вопрос на знание и внимательность, а не на качество исполнения

ZackMercury 28.04.2014 19:03

in4core, после вашей темы уж точно никто не забудет.

caseyryan 28.04.2014 19:21

Цитата:

Сообщение от Aquahawk (Сообщение 1164785)
Хорошее понимание языка это оторвать руки за такую конструкцию.

Я бы так не сказал. Такие тесты помогают включить голову и вспомнить о таких тонкостях, о которых давно забыл (или узнать, если не знал). В книжке SCJP подобных примеров вагон, правда по джаве, но мне было интересно их прорешивать. Мозг временами вообще закипал)

Aquahawk 28.04.2014 19:37

Цитата:

включить голову и вспомнить о таких тонкостях, о которых давно забыл
Да это сам люблю, но в продакшн коде...

caseyryan 28.04.2014 19:47

так тут то речь не о продакшене

alexcon314 28.04.2014 22:31

Не знаю, что вы там насокращали и как в пример затесалась запятая, но этим вы испортили годную так-то задачку на внимание.
Я, например, в первую очередь обратил внимание именно на запятую, тем более, что она стоит не на месте. Потом, сам вопрос на тесте вряд ли звучал "сколько вам нужно секунд, чтобы увидеть косяк". Так что, дубль два :). Первый неуклюжий какой-то вышел.

in4core 29.04.2014 00:15

Вопрос стоял так : что неверно в коде? И вар ответов : цикл не выполнится, ошибка компиляции и т.п.

А вот кстати насчет запятой, в подаче :

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , if ( c == 10 ) d = false;

Да это даже не скомпилируется, НО - объясни тогда людям разницу кода

Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , d = false;

Который скомпилируется :)
Почему в первом случае запятая не прокатит, а во втором вполне себе :) Раз она тебя так смутила

alexcon314 29.04.2014 09:21

А что тут объяснять? Глаз режет :).
В плане ошибок примерно следующий код вполне себе похож:
Код AS3:

foo = if (bar == 0) some = true;
// или
if( if (foo == bar) zobar = false) some = true;
// или
return if(foo > bar) some = true;

Правильно
Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , d = ( c == 10 ) ? true : false;

а проще
Код AS3:

var c:Number = 0;
var d:Boolean = true;
while ( d )  c += 0.1 , d = ( c == 10 );


Zebestov 29.04.2014 10:34

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

in4core 29.04.2014 12:31

Zebestov - я приблизительно так и думал, что навскидку здесь люди путаются. Примечательно , что данный вопрос из простейших идет.

ZackMercury 29.04.2014 13:00

in4core, людям дано ошибаться :)


Часовой пояс GMT +4, время: 00:49.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.