November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags

May 9th, 2012

dil: (Default)
Wednesday, May 9th, 2012 06:54 am
<?php
echo 0x0; echo "\n";
echo 2; echo "\n";
echo 0x0+2; echo "\n";
?>

Что получилось?

0
2
4

Самое смешное, что 0x0+ 2 тоже 4, но 0x0 +2 — только 2.

Это я ошибся, на самом деле наоборот: 0x0+ 2 даёт 2, а 0x0 +2 — 4, и добавление дополнительных пробелов перед плюсом ничего не меняет, всё равно получается 4.

Как на этом угрёбище вообще можно писать работающие программы — загадка…

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Wednesday, May 9th, 2012 07:42 am
<?php
  if("987" < "1234") {
    echo "less\n";
  } else {
    echo "not less\n";
  }
?>

“less”. По мнению аффтаров PHP _строка_ “987″ меньше, чем строка “1243″. Почему? А хз.

<?php
  if("1e4" == "10000") {
    echo "equal\n";
  } else {
    echo "not equal\n";
  }
?>

Да, эти _строки_ равны. Это фича такая, при использовании оператора == строки зачем-то всегда преобразуются в числа, даже если сравниваются не с числами, а с другими строками. Но…

<?php
echo 0x10; echo "\n";
echo 020; echo "\n";
if("0x10" == "020") {
echo "equal\n";
} else {
echo "not equal\n";
}
?>

Выдаёт “not equal”. Строки "0x10" и "020" почему-то не равны, хотя числовая интерпретация их одинакова. Восьмиричные числа в этом случае не распознаются, а интерпретируются как десятичные. "020" == "0x14".

С восьмиричными числами вообще беда. Что есть 018123?

<?php  echo 018123;  echo "\n"; >

Ага, это 1. А 8 и все последующие цифры МОЛЧА игнорируются.

Пиздец какой-то, а не язык.

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Wednesday, May 9th, 2012 02:59 pm

На ITшных собеседованиях любят задавать задачку: что делать, если в директории так много файлов, что попытка применить rm * (и даже ls *2012*) натыкается на ограничение длины  командной строки.

Я раньше думал, что задачка чисто умозрительная. Фиг там. Сегодня я случайно нашёл директорию, в которой лежало более ДВУХСОТ ТЫСЯЧ файлов. ls на ней задумывался навсегда, потому что по умолчанию пытался их отсортировать по алфавиту. du думал секунд двадцать.

Файлики туда добавлялись постепенно. Много лет. Каждый день по несколько десятков. И файловая система не сдохла. UFS на солярке.

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.

dil: (Default)
Wednesday, May 9th, 2012 06:53 pm

— Вы в баню?
— Нет, я в баню.
— А-а, а я-то думал, вы в баню!

<?php
  function print_string(string $s) {
    echo $s;
  }
  print_string("Hello world!\n");
?>

Думаете, оно напечатает “Hello world!”? Агащазблин:
PHP Catchable fatal error: Argument 1 passed to print_string() must be an instance of string, string given.

В некоторой степени такое поведение соответствует документации. Там написано, что type hint может быть объектом (а также некоторыми другими типами), но не может быть встроенным скалярным типом (в частности, string). Но сообщение выглядит совершенно по-идиотски: тут требуется экземпляр строки, а вы вместо него подсунули строку. Типичный случай приведённого выше эпиграфа.

Кроме того, ошибка возникает не во время компиляции, когда было бы логично распознать запрещённый встроенный тип и сообщить, что он здесь неуместен, а во время выполнения, о чём свидетельствует перехватываемость ошибки (catchable).

И несмотря на якобы фатальность ошибки, её можно перехватить и продолжить выполнение программы. И какая она после этого “фатальная”? Brain damage в полный рост.

Оригинал этой записи в личном блоге.
Любые материалы из этого блога запрещается использовать на сайте livejournal.ru в любой форме и любом объёме.