LINUX.ORG.RU

Забавный пример преобразования типов на Си

 


1

1

https://www.onlinegdb.com/S00Xzrubl

#include <stdio.h>

int main()
{
    printf("%i %i %c %i %i %c %i %i %c %i %i %s", 
        '1'+'5'+'9',    // 159
        '9'-'2',        // 7
        '9'- 2 ,        // всё ещё 7
        '9'- 2 ,        // автохрен, 55
        '5'+ 2 ,        // 55 (╯°□°)╯︵ ┻━┻
        '5'+ 2 ,        // а, не, норм, 7
         1 * 1 ,        // единичка 
         0 *'1',        // нолик
        '0'*'1',        // ну слава богу, нолик
        '1'*'1',        // 2401 щ(゜ロ゜щ)
        '1'*'0',        // верни. мне. мой. нолик.
    "¯\\_(ツ)_/¯");     

    // да пошло оно всё, буду проституткой

    return 0; 
}
★★★★★

Так всё же правильно. Янипоял юмора.
Это скорее пост для пабликов соц сетей типа vk, и сразу под постом будет «В python такой херни нету», а следом «Сразу видно скриптмакаку делающую выводы на том что не понимает», а ниже «Лох, ты! Это мой друг работает в банке он знает что говорит и питон топчик, а ты обрыган нищий» и так далее. Короче провокация для столкновения лбов =) Не раз такое видел.

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

Я сам попался, в мельчешении %i не сразу увидел, чисто подстава

Но всё равно, чисто милая забава ^.^

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от goingUp

И этим людям не нравится преобразование типов в PHP

Так тут нет никакого преобразования. ТС просто внезапно открыл для себя printf и обнаружил, что один и тот же int — набор бит в памяти — можно интерпретировать как целое число, как код символа ASCII и ещё кучей способов. Потом до кучи наткнулся на символьные константы (в одиночных кавычках), и ему снесло башню окончательно. Надеюсь, это пройдёт %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от slovazap

Тебя безмерно удивляет

…как тщательно человек подбирал остатки от деления на 256 и соотносил их со входными данными.

question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от Nervous

Ну не знаю, лично мне кажется, что если бы ‘9’-2 имело тип int, это было бы более логично) Какой тип у ‘1’*‘1’ из примера вообще не понятно)

Да, и какого хрена ‘9’-‘2’ инт а ‘9’-2 char?

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

Ну не знаю, лично мне кажется, что если бы ‘9’-2 имело тип int, это было бы более логично) Какой тип у ‘1’*‘1’ из примера вообще не понятно)

Да, и какого хрена ‘9’-‘2’ инт а ‘9’-2 char?

Оно всё внутри обрабатывается как int. Но иногда выводится не как int, а берётся младший байт, и выводится соответствующий символ ASCII.

question4 ★★★★★
() автор топика
Ответ на: комментарий от Nervous

ТС просто внезапно открыл для себя printf

Нет, я внезапно вспомнил про %c, которым никогда не пользовался.

Потом до кучи наткнулся на символьные константы (в одиночных кавычках)

Когда работал с Си — давно и недолго — споткнулся об это, запомнил, что одинарные и двойные кавычки имеют разное значение, и пользовался только двойными. Когда увидел программу, первой мыслью было: «А почему кавычки не двойные? С одинарными же результат не соответствует ожиданиям.»

question4 ★★★★★
() автор топика

Такое ощущение, что это придумано для собесов троллить и унижать кандидатов. Только учти, что это работает и в обратную сторону: могут посчитать за «пример из жизни» и сделать соответствующие выводы о кодовой базе.

DarkAmateur ★★★★
()
Последнее исправление: DarkAmateur (всего исправлений: 1)
Ответ на: комментарий от goingUp

если бы ‘9’-2 имело тип int, это было бы более логично

char - int так и так приведется к int. Другое дело, что 57-2=55, а это код ‘7’, который интерпретируется форматом %c

Какой тип у ‘1’*‘1’ из примера вообще не понятно

sizeof(‘1’) == 4, то есть хранится оно как int. Ну а 49*49=2401

Да, и какого хрена ‘9’-‘2’ инт а ‘9’-2 char?

Они оба int, просто в одном случае интерпретируется как int (формат %i), а в другом - как char (%c)

COKPOWEHEU
()