• '1' + '5' + '9': в одиночных кавычках — это char, код символа в кодировке. В большинстве современных машин кодировка — что-то основанное на ASCII, то есть 49+53+57=159. Просто забавно подобранные ASCII-коды. Формат %i выводит всё это как int, основной целый тип.
• '9' - '2': это число 7 во всех мыслимых кодировках: для удобства программирования цифры располагают последовательно от 0 до 9.
• '9' - 2 в форматах %i и %c: опять-таки, это код символа '7' во всех мыслимых кодировках, так что формат %i должен вывести код символа '7' (55 в ASCII и производных), а формат %c — соответствующий символ. Но тут есть и ещё один хитрый уровень: в функциях с переменными параметрами всё, что короче, чем int, расширяется до int, а float до double — потому кидать в стек int и писать в форматной строке тип char безопасно. На всех машинах. В любом случае возьмёт из стека четыре (как правило, но не обязательно) байта, а из них — только младший.
• '5' + 2 в форматах %i и %c: аналогично.
• 1*1 в формате %i — единица. Ну, это понятно.
• 0*'1' в формате %i — это должен быть ноль.
• '0'*'1' в формате %c: зависит от кодировки, но в мире победившего ASCII это будет 48·49=2352. Как сказано выше, кидать в стек int и писать формат %c безопасно, но будет взят младший байт — остаток от деления на 256. Коды подобраны так, чтобы это был 48, то есть символ '0'.
UPD. Простейшая математика говорит, что это будет '0' во всех кодировках, где код цифры '0' делится на 16. И в EBCDIC тоже. Если, конечно, байт восьмибитный — а то всякие были машины во времена появления Си.
• '1'*'1' и '1'*'0' в формате %i: если '0'=48 и '1'=49, считайте сами.
• Смайлик с катаканой в формате %s: работает на Unix-подобных системах, где остановились на рабочей кодировке UTF-8. Иначе хрен вам, а не катакана.
Объясняю для непрограммистов.
• '1' + '5' + '9': в одиночных кавычках — это char, код символа в кодировке. В большинстве современных машин кодировка — что-то основанное на ASCII, то есть 49+53+57=159. Просто забавно подобранные ASCII-коды. Формат %i выводит всё это как int, основной целый тип.
• '9' - '2': это число 7 во всех мыслимых кодировках: для удобства программирования цифры располагают последовательно от 0 до 9.
• '9' - 2 в форматах %i и %c: опять-таки, это код символа '7' во всех мыслимых кодировках, так что формат %i должен вывести код символа '7' (55 в ASCII и производных), а формат %c — соответствующий символ. Но тут есть и ещё один хитрый уровень: в функциях с переменными параметрами всё, что короче, чем int, расширяется до int, а float до double — потому кидать в стек int и писать в форматной строке тип char безопасно. На всех машинах. В любом случае возьмёт из стека четыре (как правило, но не обязательно) байта, а из них — только младший.
• '5' + 2 в форматах %i и %c: аналогично.
• 1*1 в формате %i — единица. Ну, это понятно.
• 0*'1' в формате %i — это должен быть ноль.
• '0'*'1' в формате %c: зависит от кодировки, но в мире победившего ASCII это будет 48·49=2352. Как сказано выше, кидать в стек int и писать формат %c безопасно, но будет взят младший байт — остаток от деления на 256. Коды подобраны так, чтобы это был 48, то есть символ '0'.
UPD. Простейшая математика говорит, что это будет '0' во всех кодировках, где код цифры '0' делится на 16. И в EBCDIC тоже. Если, конечно, байт восьмибитный — а то всякие были машины во времена появления Си.
• '1'*'1' и '1'*'0' в формате %i: если '0'=48 и '1'=49, считайте сами.
• Смайлик с катаканой в формате %s: работает на Unix-подобных системах, где остановились на рабочей кодировке UTF-8. Иначе хрен вам, а не катакана.