Дак ссылки же повторяются! Переполнение?
Почему переполнение? Скрипт exit code 0 успех, функция делает принт и возвращает 0, ну и всё. дайте мне КЭПа
Ваш КЭП на месте. Тут прикол в том, что printf в зависимости от спецификаторов формата одну и ту же информацию будет по разному печатать. Символ '9' в ASCII имеет 10-чное значение 57, а '2' - 50, и поэтому '9' - '2' = 7, а '9' - 2 = '7' или 55 в ASCII. И все остальные приколы на этом и основаны тут
Ну и соответственно формат вывода руками там и выбраны чтобы запутать (%i - integer, %c - char, %s - string)
пиздец. до рофла доебались.
Во-первых там просили кэпа.
Во-вторых, как завещали нам предки "факты > лулзы". А то ну что это за хурма такая, что каждый второй рофл это или самое стереотипное смещно потому что автор не в теме но делает вид что в теме, или самое стереотипное смещно потому что атор в теме но пытается продать это тем кто не в теме
Во-вторых, как завещали нам предки "факты > лулзы". А то ну что это за хурма такая, что каждый второй рофл это или самое стереотипное смещно потому что автор не в теме но делает вид что в теме, или самое стереотипное смещно потому что атор в теме но пытается продать это тем кто не в теме
может чтобы и запутать, но стринг там чисто чтобы развести ручками в потешном недоумении+)
А блэт, точно. Я подумал что %i, %c - это ссылки. Скриптовое болото отупляет.
Разбираться в типах данных? Да ну нахуй, "чукча не читатель".
Не перегружать операторы в языке со слабой типизацией? Да ну нахуй, пусть работает как получится
Погляди мнимательнее, писатель специально %i и %с в принте расставил. Ну и это, си это уже язык со слабой типизацией?)
Хех. Если б тут были б чюваки из одной группы телеграма, где обсуждают дизайн языков программирования, то они б тут сейчас такой холивар бы устроили вокруг типизации в C языке.
Компилятор сделал все что мог, но программист оказался тупой проституткой.
Хитрой прошмандовкой.
пусть javascript посмотрит, там можно без %i %c схожее получить)
Главный прикол js тут в том, что там все эти трансформации не понятно какую вообще логику под собой имеют. В Си же всё элементарно, если помнить, что '9' == 0x39 == 57, тоесть с точки зрения языка это одно и тоже, что позволяет проводить с ними одинаковые операции )
а в js просто нужно понимать в каком порядке работает приведение типов
и всё
и всё
вот только понять это невозможно, если ты не гнвоерк
Всё элементарно, если помнить правила из стандарта языка.
Тип '9' - int, а не char - элементарно. int - signed int, а char - не обязательно signed char, может быть и unsigned char - элементарно. В printf char автоматически кастуется до int, а в scanf нельзя путать int* и char* - элементарно.
В JS плюс кастует операнды к String, кроме случая, когда оба операнда - числа, а минус - к Number, и это настолько же элементарно.
Тип '9' - int, а не char - элементарно. int - signed int, а char - не обязательно signed char, может быть и unsigned char - элементарно. В printf char автоматически кастуется до int, а в scanf нельзя путать int* и char* - элементарно.
В JS плюс кастует операнды к String, кроме случая, когда оба операнда - числа, а минус - к Number, и это настолько же элементарно.
159 хитро подобрано. Я проверил, таких чисел всего 10: 150...159. Ни для каких других трех цифр это не работает. И ни для каких двух, или четырех и более цифр такое совпадение тоже никогда не случается.
Фактически взяли уникальное забавное совпадение, чтобы еще больше запутать читателя. В си есть проблемы из-за ручной работы с памятью, но самовольное, неинтуитивное и непонятное преобразование символов и чисел - этим си точно не страдает.
Фактически взяли уникальное забавное совпадение, чтобы еще больше запутать читателя. В си есть проблемы из-за ручной работы с памятью, но самовольное, неинтуитивное и непонятное преобразование символов и чисел - этим си точно не страдает.
>этим си точно не страдает.
и тут стоило бы сказать: он этим наслаждается
и тут стоило бы сказать: он этим наслаждается
Не, и не наслаждается.
С наслаждается поистину свободной арифметикой. Особенно адресной.
Ну и интерпретацией, да. Тут мы как раз видим пример, как можно интерпретировать одни и те же значения по-разному. И это ещё очень лайт. А вот когда начинается каст указателя одного типа на другой, вот там может начаться такая магия...
С наслаждается поистину свободной арифметикой. Особенно адресной.
Ну и интерпретацией, да. Тут мы как раз видим пример, как можно интерпретировать одни и те же значения по-разному. И это ещё очень лайт. А вот когда начинается каст указателя одного типа на другой, вот там может начаться такая магия...
тут магия ожидает тех, кто плохо учился. и это касается не только программирования
всё равно лучше чем data type mismatch
Автохрен или авотхрен?
Хотя, один хрен ....
Хотя, один хрен ....
сиплюсплюсник в трэде! Меня никто не спрашивал, но смог устоять чтоб не расшифровать этот ребус:
Вся магия в том, какими числами кодируются символы цифр
'0' - 0x30 - 48
'1' - 0x31 - 49
'2' - 0x32 - 50
'3' - 0x33 - 51
'4' - 0x34 - 52
'5' - 0x35 - 53
'6' - 0x36 - 54
'7' - 0x37 - 55
'8' - 0x38 - 56
'9' - 0x39 - 57
И в том, что значат эти закорючки в printf
%i - интерпретировать байты как число(3, 14, 15)
%с - интерпретировать байты как символ('W', 'o', 'r', 'l', 'd')
И дальше этот фокусник просто жонглирует этими двумя, по сути, несложными инструментами:
1) число: '1' + '5' + '9'
Тут просто подобраны такие символы, коды которых случайно суммируются в "такое же число"
0x31 + 0x35 + 0x39 = 0x9f = 159
2) число: '9' - '2'
Коды символов цифр отличаются ровно на 0x30. Общая часть при вычитании просто сокращается
0x39 - 0x32 = 0x7 = 7
3) символ: '9' - 2
Тут не та же семерка, что в (2). В (2) было число, а сейчас символ
0x39 - 2 = 0x37 = '7'
4) число: '9' - 2
Выражение то же что и в (3), но в (3) данные интерпретировались как символ, а тут как число
0x39 - 2 = 0x37 = 55
5) число: '5' + 2
0x35 + 2 = 0x37 = 55
6) символ: '5' + 2
Выражение то же что и в (5), но в (5) данные интерпретировались как число, а тут как символ
0x35 + 2 = 0x37 = 55 = 'a'
7) число: 1 * 1
1 * 1 = 1
8) число: 0 * '1'
0 * 0x31 = 0
9) символ: '0' * '1'
Тут ноль получился неспроста. Если перемножить коды символов, то получится переполнение. Если не вдаваться в подробности, то можно думать об этом как будто из результирующего числа возьмутся только две последние цифры
0x30 * 0x31 = 0x930 -> 0x30 = '0'
10) число: '1' * '1'
0x31 * 0x31 = 0x961 = 2401
11) символ: '1' * '0'
Выражение почти то же что и в (9), но в (9) данные интерпретировались как символ, а тут как число
0x30 * 0x31 = 0x930 = 2352
Вся магия в том, какими числами кодируются символы цифр
'0' - 0x30 - 48
'1' - 0x31 - 49
'2' - 0x32 - 50
'3' - 0x33 - 51
'4' - 0x34 - 52
'5' - 0x35 - 53
'6' - 0x36 - 54
'7' - 0x37 - 55
'8' - 0x38 - 56
'9' - 0x39 - 57
И в том, что значат эти закорючки в printf
%i - интерпретировать байты как число(3, 14, 15)
%с - интерпретировать байты как символ('W', 'o', 'r', 'l', 'd')
И дальше этот фокусник просто жонглирует этими двумя, по сути, несложными инструментами:
1) число: '1' + '5' + '9'
Тут просто подобраны такие символы, коды которых случайно суммируются в "такое же число"
0x31 + 0x35 + 0x39 = 0x9f = 159
2) число: '9' - '2'
Коды символов цифр отличаются ровно на 0x30. Общая часть при вычитании просто сокращается
0x39 - 0x32 = 0x7 = 7
3) символ: '9' - 2
Тут не та же семерка, что в (2). В (2) было число, а сейчас символ
0x39 - 2 = 0x37 = '7'
4) число: '9' - 2
Выражение то же что и в (3), но в (3) данные интерпретировались как символ, а тут как число
0x39 - 2 = 0x37 = 55
5) число: '5' + 2
0x35 + 2 = 0x37 = 55
6) символ: '5' + 2
Выражение то же что и в (5), но в (5) данные интерпретировались как число, а тут как символ
0x35 + 2 = 0x37 = 55 = 'a'
7) число: 1 * 1
1 * 1 = 1
8) число: 0 * '1'
0 * 0x31 = 0
9) символ: '0' * '1'
Тут ноль получился неспроста. Если перемножить коды символов, то получится переполнение. Если не вдаваться в подробности, то можно думать об этом как будто из результирующего числа возьмутся только две последние цифры
0x30 * 0x31 = 0x930 -> 0x30 = '0'
10) число: '1' * '1'
0x31 * 0x31 = 0x961 = 2401
11) символ: '1' * '0'
Выражение почти то же что и в (9), но в (9) данные интерпретировались как символ, а тут как число
0x30 * 0x31 = 0x930 = 2352
Чтобы написать коммент, необходимо залогиниться