суббота, 20 сентября 2014 г.

ОПЕРАТОРЫ в JavaScript


Математические операции

Результаты мат. операций дополняются значениями Infinity, -Infinity, NaN


Унарные: +, -
Бинарные: +, -, *, /, % (остаток от деления).


Бинарный + при хотя бы одном нечисленном аргументе приводит оба аргумента к строковому типу (приведение к строке начинается на первом строковом аргументе, до этого все числовые операции выполняются. 2 + 2 + “aaa” = “4aaa”    “aaa” + 2 + 2 = “aaa22”). Все остальные армифметические операции приводят результат к числу.




Присваивание также возвращает значение (равное присвоенному значению)
alert (x = 3) присвоит значение 3 переменной х и вернет 3.


Побитовые операторы

Унарные: ~ - not
Бинарные: | - or, & - and, ^ - xor, сдвиги - <<, >>. >>>


<< n - сдвиг влево на n бит с заполнением нулями справа и отбрасыванием битов слева.
>> n - сдвиг влево на n бит с заполнением знаковым битом слева (0 для положительных и 1 для отрицательных чисел) и отбрасыванием битов справа.
>>> n - сдвиг влево на n бит с заполнением нулями слева и отбрасыванием битов справа


Применение:


a ^ b ^ b = a - xor можно использовать для примитивного шифрования.
a ^ 0 - получение целочисленной части числа a
|, & - битовые флаги при проверке прав доступа.
~n - проверка на -1 (только при n=-1 возвращается 0)
- степение двойки.

При использовании побитовых операторов переменные скрыто приводятся к 32-битовому знаковому целому.


Оператор запятая (,) - выполняет последовательность действий до и после запятой и возвращает значение последнего из них. Часто используется при определении переменных и задании начальных условий циклов.


При сравнении операнды преобразуются к числам (в т.ч. и булевские значения). Для строго сравнения без приведения типов используются операторы === и !==
null == undefined // true
null === undefined // false
null и undefined равны друг другу и не равны чему бы то ни было еще.


При этом
null >= 0, null <= 0 // true, true


Условные операторы


if (cond1) { do1; } else if (cond2) { do2; } else { do3; }

switch(x) {
 case 'value1':  // if (x === 'value1')
   ...
   [break]
 case 'value2':  // if (x === 'value2')
   ...
   [break]
 default:
   ...
   [break]
}

При отсутствии break выполняются все оставшиеся операторы switch без проверки условий.
Результат вычисления логического выражения 0, ‘’ (пустая строка), NaN, undefined расценивается как false, все остальные - true.


Важно! {}, [], “0”, “ “ - true.


Краткое условие - условие ? значение1 : значение2
Допускается составная конструкция:
var res = (x == 1) ? 'val1' :
(x == 2) ? 'val2' :
'val3';


Логические операторы


||, &&, ! - или, и, не

Если условий несколько, то для "И" выполнение прекращается на первом false, для "ИЛИ" - на первом true.

Вместо краткого условного оператора можно использовать логические операторы:

x === 3 && 10 || 5 эквивалентно x === 3 ? 10 : 5;
x === 1 && 10 || x === 2 && 20 || x === 3 && 30 : 40; - составной условный оператор.


Циклы


while (cond) { // body }
do { // body } while (cond)

for ([begin]; [cond]; [step]) { // body }

ТИПЫ ДАННЫХ JavaScript

Общие сведения


number, string, boolean, null, undefined, object
function - разновидность объекта, но тоже считается типом данных.


Для целочисленных и дробных значений выделяется 8 байт памяти (усекается до 4-х при битовых операциях).


Строковый тип


.length - возвращает длину строки
.charAt(n) - возвращает строку, содержающую символ в позиции n (нумерация с 0),
пустая строка, если символ отсутствует..
str[n] - аналогично charAt(), но возвращает undefined, если строка отсутствует.


Строки не меняются, не редактируются, только заменяются на новые (переопределяются).


.toLowerCase(), .toUpperCase() - приведение к нижнему/верхнему регистру.
.substring(start [, end]) - возвращает подстроку с позиции start до,
но не включая end (до конца, если end не указан). Отрицательные значения второго аргумента приравниваются к 0.
.substr(start [, length]) - как и substring, но второй аргумент содержит не конечную
позицию, а количество символов.
.slice(start [, end]) - как и substring, но отрицательные значения второго аргумента
отсчитываются от конца строки.
.fromCharCode(code) - возвращает символ по коду code.
.charCodeAt(pos) - возвращает код символа на позиции pos. Отсчет позиции
начинается с нуля.
Числа


Помимо десятичной возможно использование шестнадцатиричной (0x23ab) и восьмеричной (003, 07) системах, а также в “научном формате” (23e3 = 23 000, 23e-3 = 0,023). .toString([n])  - преобразование в систему по основанию n (по умолчанию 10, от 2 до 36). В т.ч. и дробные.


Приведение к числу производится унарным плюсом. Преобразование строгое (не число = NaN)
+false = 0 +true = 1 +null = 0 +undefined = NaN +”” = 0


Мягкое преобразование - parseInt(), parseFloat(). Отсекает пробельные символы в начале, останавливается на первой ошибке. При невозможности получить число возвращает NaN.
parseInt(“12px”) = 12; parseInt(“1.2.3”) = 1.2; parseInt(“str15”) = NaN;


0/0 = Infinity + -Infinity = Infinity / Infinity = Infinity - Infinity = NaN
a/0 = Infinity * Infinity = Infinity + Infinity = Infinity + a = Infinity (а - число)


isNan(n) = true не только для n = NaN, но и для любых нечисел ({}, undefined, "foo"), которые становятся NaN в результате преобразования к числу.

Для строгой проверки можно использовать функцию:

function isReallyNaN(x) { return x !== x; }

NaN в соответствии со стандартом не равно само себе любая операция с ним также возвращает NaN.

isFinite(Infinity) = isFinite(-Infinity) = isFinite(NaN) = false, иначе true

Существует два нуля (по стандарту IEEE754) - положительный и отрицательный. Оба равны друг другу и одинаково выглядят в консоли. В редких случаях, когда важен знак нуля (важно с какой стороны к нему подобрались) можно использовать функцию Object.is.

var x = -10/Infinity; // -0
Object.is(x, 0);      // > false
Object.is(x, -0);     // > true

Этой же функцией можно проверять объекты на равенство NaN.


Округление


Math.floor() - вверх, Math.ceil() - вниз, Math.round() - до ближайшего целого.


Побитовые операции, не изменяющие число, аналогичны Math.round().  Например, ~~x или x ^ 0.


.toFixed([n])- округляет до n-го знака после запятой (от 0 - по умолчанию до 20), возвращает строку.
+(price1 + price2).toFixed(2)


Преобразование типов


При преобразовании в число null становится 0, а undefined - NaN.
true/false => 1/0
Строки преобразуются по алгоритму:
  1. Отрезать все пробелы
  2. Если остается пустая строка, то 0.
  3. Если строка не пустая, то считываем число с начала. Если числа нет (буквы, пробелы, отделяющие точку от числа), то NaN.
Численное преобразование происходит при сравнении разных типов. Явно его можно произвести вызвом функции Number или использованием унарного плюса (var a = +”22”;)


При преобразовании в строку - ‘null’,‘undefined’,`true’, `false’ соответственно.
Строковое преобразование происходит в функциях вывода (console.log(), alarm()). Явно его можно произвести функцией String() или бинарным плюсом, если один из аргументов этого оператора - строка.

При преобразовании к логическому значению false становятся только undefined, null, 0, NaN, “”. Все остальное - true. Логическое преобразование происходит при использовании логических операторов или в логическом контексте (if, while). Явное преобразование можно произвести функцией Boolean() или двойным отрицанием (!!a).

четверг, 18 сентября 2014 г.

Ключевые слова Java

Базовые типы данных:
byte    short   int     long    float   double  char    boolean

Выполнение цикла:
do      while   for     break   continue

Выполнение перехода:
if      else    switch  case    default (break)

Модификаторы переменных и классов:
private     public      protected   final       static
abstract    volatile    strictfp    synchronized

Обработка особых ситуаций:
try     catch   finally throw   throws

Методы:
return  void

Пакеты:
package import

Прочие ключевые слова:
class   extends new     this    super   implements instanceof
assert  native  enum    transient       interface

Зарезервированные слова:
const   goto

Предопределенные значения
true    false   null

Ключевые слова в Си

C89

auto      break     case      char    const     continue  default
do        double    else      enum    extern    float     for
goto      if        int       long    register  return    short
signed    sizeof    static    struct  switch    typedef   union
unsigned  void      volatile  while

C99

inline    restrict  _Bool    _Complex  _Imaginary

C11

_Alignas  _Alignof  _Atomic  _Generic  _Noretrun  _Static_assert
_Thread_local



Спецификаторы функций
inline - позволяет компилятору (на его усмотрение) оптимизировать код, непосредственно встраивая тело функции вместо ее вызова. 
_Noretrun - указывает на то, что поток выполнения не возвращается после вызова функции (прерывание, исключение, выход из программы, longjmp()).


Спецификаторы постоянства-изменяемости
const - переменная должна быть инициализирована при определении и не может меняться в ходе выполнения программы.
volatile - переменная может меняться не только потоком выполнения программы (например, при мэппинге регистров на основную память).

Спецификаторы времени хранения
auto - объявляется и хранится в пределах блока (функции, цикла или иного блока, ограниченного {}). По умолчанию все переменные имеют тип auto. В С++ имеет другое значение.
register - рекомендация компилятору сделать доступ к переменной наиболее быстрым (по возможности поместить в регистр).
static - оставаясь видимой в пределах блока, где она объявлена, статическая переменная сохраняет свое значение (например, между вызовами функций или при повторном заходе в цикл). Переменная static, объявленная на уровне файла, становится доступной только в нём.
extern - объявление переменной, определенной в другом модуле без выделения памяти.
_Thread_local - копия переменной создается для каждого потока и уничтожается вместе с ним. Может быть дополнительно static или extern.


restrict - применяется только для указателей и означает, что объекты, на которые ссылаются указатели, не пересекаются (например, при копировании области памяти возможно частичное пересечение) и не совпадают (указывают на одну и ту же переменную или область памяти). При компиляции не проводятся проверки на пересечение и совпадение.

понедельник, 8 сентября 2014 г.

Кроссплатформенность и порядок байтов

Стандарт С99 вводит заголовочный файл stdint.h, в котором определяются архитектурно-независимые целочисленные типы данных:

int8_t,  int16_t,  int32_t,  int64_t     знаковые
uint8_t, uint16_t, uint32_t, uint64_t    беззнаковые

LE - x86, x64, i8051, Atmel AVR
BE - ARM, PowerPC, SPARC, Atmel AVR32

Для работы с различным порядком байтов используется семейство функций htonX() и ntohX(). Заголовочные файлы для этих функций различны для разных ОС, поэтому лучше использовать макрос:

#ifdef _MSC_VER
#include <winsock2.h>
#else
#include <arpa/inet.h>
#endif

htonX() преобразует порядок байтов из принятого для данной архитектуры в сетевой (big-endian).
ntohX() преобразует порядок байтов из сетевого (big-endian) в принятый для данной архитектуры.

htons(), ntohs() - short
htonl(), ntohl() - long
htonll(), ntohll() - long long

Макрос для определения стандартной функции hton() (для стандарта С11).

#define hton(x) _Generic(x, 
short: htons(x),
long:  htonl(x),
long long: htonll(x))