капитан команды думает, что LabVIEW лучше для своей простоты изучения и обучения. Это верно?
я сомневаюсь, что это было бы верно для любого единственного языка или парадигмы. LabView мог, конечно, быть легче для людей с инженерным образованием электроники; создание программ в нем "просто" тянет провода. С другой стороны такие люди могли бы уже быть представлены программированию, также.
Одно существенное различие - кроме от диаграммы - то, что LV основан на спросе (поток) программирование. Вы запускаете с результата и говорите, что необходимо для получения до него. Традиционное программирование имеет тенденцию быть обязательным (движение наоборот).
Некоторые языки могут обеспечить оба. Я обработал библиотеку многопоточности для Lua недавно (Маршруты), и он может использоваться для основанного на спросе программирования в в других отношениях обязательной среде. Я знаю, что существуют успешные роботы, выполненные главным образом в Lua там ( Сумасшедший Ivan в Lua, О, Шесть).
Используйте комбинацию QuickGraph и График № (WPF) - обе первоклассные библиотеки. У меня они работают очень хорошо, но документации для Graph # почти не существует.
При выполнении побитовой операции число преобразуется в 32-битное целое число со знаком, теряются все дроби и старшие разряды, чем 32, перед выполнением вычисления и последующим преобразованием обратно в число. Таким образом, при выполнении побитовой операции без фактического эффекта, как сдвиг вправо на 0 бит >> 0
, это быстрый способ округлить число и убедиться, что оно находится в 32-битном диапазоне int. Кроме того, тройной оператор >>>
после выполнения своей операции без знака преобразует результаты своих вычислений в число как целое число без знака, а не целое число со знаком, как это делают другие, поэтому его можно использовать для преобразования отрицательных значений. в 32-битную версию с дополнением до двух как большое число. Использование >>> 0
гарантирует, что у вас есть целое число от 0 до 0xFFFFFFFF.
В данном случае это полезно, потому что ECMAScript определяет индексы массива в виде 32-битных целых чисел без знака. Поэтому, если вы пытаетесь реализовать array.filter
способом, который точно дублирует то, что говорит стандарт ECMAScript Fifth Edition, вы должны преобразовать число в 32-битное целое без знака, как это.
(В На самом деле в этом мало практической необходимости, так как, надеюсь, люди не будут устанавливать array.length
равным 0,5
, -1
, 1e21
] или 'LEMONS'
. Но мы говорим об авторах JavaScript, так что вы никогда не узнаете ...)
Резюме:
1>>>0 === 1
-1>>>0 === 0xFFFFFFFF -1>>0 === -1
1.7>>>0 === 1
0x100000002>>>0 === 2
1e21>>>0 === 0xDEA00000 1e21>>0 === -0x21600000
Infinity>>>0 === 0
NaN>>>0 === 0
null>>>0 === 0
'1'>>>0 === 1
'x'>>>0 === 0
Object>>>0 === 0
(*: ну, они определены как ведущие Меня не удивило бы, если бы какой-нибудь движок JavaScript действительно использовал целые числа, когда мог, по соображениям производительности.
Это оператор сдвига вправо без знака . Разница между этим и оператором правого битового сдвига со знаком заключается в том, что беззнаковый правый битовый сдвиг ( >>> ) заполняется нулями слева, и подписанный оператор сдвига правого бита ( >> ) заполняется битом знака, таким образом сохраняя знак числового значения при сдвиге.
Дриис достаточно подробно объяснил, что такое оператор и что он делает. Вот его смысл / почему он был использован:
Сдвиг любого направления на 0
возвращает исходное число и приводит к преобразованию null
в 0
. Кажется, что пример кода, который вы смотрите, использует this.length >>> 0
, чтобы гарантировать, что len
является числовым, даже если this.length
равно не определен.
Для многих побитовые операции неясны (и Дуглас Крокфорд / jslint предлагает не использовать такие вещи). Это не значит, что это неправильно, но существуют более подходящие и знакомые методы, позволяющие сделать код более читабельным. Более четкий способ убедиться, что len
равно 0
, - это один из следующих двух методов.
// Cast this.length to a number
var len = +this.length;
или
// Cast this.length to a number, or use 0 if this.length is
// NaN/undefined (evaluates to false)
var len = +this.length || 0;
>>>
- это беззнаковый оператор сдвига вправо (см. с. 76 спецификации JavaScript 1.5), в отличие от >>
, знакового оператора сдвига вправо.
>>>
изменяет результаты сдвига отрицательных чисел, поскольку не сохраняет бит знака при сдвиге. Последствия этого можно понять на примере интерпретатора:
$ 1 >> 0
1
$ 0 >> 0
0
$ -1 >> 0
-1
$ 1 >>> 0
1
$ 0 >>> 0
0
$ -1 >>> 0
4294967295
$(-1 >>> 0).toString(16)
"ffffffff"
$ "cabbage" >>> 0
0
Итак, вероятно, здесь предполагается получить длину или 0, если длина не определена или не является целым числом, как в примере с "капустой"
выше. Думаю, в этом случае можно предположить, что this.length
никогда не будет < 0
. Тем не менее, я бы утверждал, что этот пример - отвратительный хак, по двум причинам:
Поведение <<<
при использовании отрицательных чисел - побочный эффект, который, вероятно, не предполагался (или мог возникнуть) в приведенном примере.
Намерение кода не очевидно, о чем свидетельствует наличие этого вопроса.
Лучшей практикой, вероятно, является использование чего-то более читабельного, если только производительность не является абсолютно критичной:
isNaN(parseInt(foo)) ? 0 : parseInt(foo)
Оператор беззнакового сдвига вправо используется во всех реализациях метода array extra's в Mozilla, чтобы гарантировать, что свойство length
является беззнаковым 32-битным целым.
Свойство length
объектов массивов описано в спецификации следующим образом:
Каждый объект Array имеет свойство length, значение которого всегда является неотрицательным целым числом меньше 232.
Этот оператор - самый короткий способ достичь этого, внутри методы массива используют операцию ToUint32
, но этот метод недоступен и существует в спецификации для целей реализации.
Реализации Mozilla array extras пытаются быть ECMAScript 5 совместимыми, посмотрите на описание метода Array.prototype.indexOf
(§ 15.4.4. 14):
1. Let O be the result of calling ToObject passing the this value as the argument. 2. Let lenValue be the result of calling the [[Get]] internal method of O with the argument "length". 3. Let len be ToUint32(lenValue). ....
Как видите, они просто хотят воспроизвести поведение метода ToUint32
для соответствия спецификации ES5 на реализации ES3, и, как я уже говорил, оператор беззнакового сдвига вправо - самый простой способ.
Две причины:
Результатом >>> является "интеграл"
undefined >>> 0 = 0 (так как JS попытается принудить LFS к числовому контексту, это будет работать для "foo" >>> 0 и т. Д.)
Помните, что числа в JS имеют внутреннее представление типа double. Это просто «быстрый» способ базового ввода длины.
Однако , -1 >>> 0 (ой, вероятно, не желаемая длина!)