ответ PIC18, данный TK, приводит к следующим инструкциям (двоичный файл):
overflow
PUSH
0000 0000 0000 0101
CALL overflow
1110 1100 0000 0000
0000 0000 0000 0000
Однако один только ВЫЗОВ выполнит переполнение стека:
CALL $
1110 1100 0000 0000
0000 0000 0000 0000
, Но RCALL (относительный вызов) меньше все еще (не глобальная память, таким образом, никакая потребность в дополнительных 2 байтах):
RCALL $
1101 1000 0000 0000
, Таким образом, самой маленькой на PIC18 является единственная инструкция, 16 битов (два байта). Это взяло бы 2 командных цикла на цикл. В 4 тактах на командный цикл у Вас есть 8 тактов. PIC18 имеет 31 стопку уровня, поэтому после 32-го цикла, он переполнит стека в 256 тактах. На уровне 64 МГц Вы были бы переполнять стека за 4 микро секунды и 2 байта .
Однако серия PIC16F5x использует инструкции на 12 битов:
CALL $
1001 0000 0000
Снова, два командных цикла на цикл, 4 часов на инструкцию так 8 тактов на цикл.
Однако PIC16F5x имеет две стопки уровня, таким образом, на третьем цикле он переполнился бы в 24 инструкциях. На уровне 20 МГц это было бы переполнение за 1,2 микро секунды и 1,5 байта .
Intel 4004 имеет инструкцию по подпрограмме вызова на 8 битов:
CALL $
0101 0000
Для любопытного, которое соответствует ASCII 'P'. С 3 стопками уровня, которые берут 24 такта для в общей сложности [1 123] 32,4 микро секунды и один байт . (Если Вы не разгоняетесь, Ваши 4004 - продвигаются, Вы знаете, что хотите.)
, Который является столь же маленьким как ответ befunge, но очень, намного быстрее, чем код befunge, работающий в текущих интерпретаторах.
Вы можете избежать этого, разместив двойной "%", например: %%
Используя ваш пример:
printf("hello%%");
Экранирование знака "%" только для printf. Если вы это сделаете:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Он напечатает: Это значение a: %%
Нитпик:
Вы действительно не избежите %
в строке, определяющей формат для семейства функций printf ()
(и scanf ()
).
%
в семействе функций printf ()
(и scanf ()
) запускает спецификацию преобразования. Одно из правил для спецификации преобразования гласит, что %
в качестве спецификатора преобразования (сразу после %
, который начал спецификацию преобразования) вызывает символ '%'
должна быть записана без преобразования аргументов.
Строка на самом деле содержит 2 '%'
символа внутри (в отличие от экранирующих символов: «a \ bc»
] - строка с 3 ненулевыми символами; "a %% b"
Если нет форматы в строке, вы можете использовать put
(или fputs
):
puts("hello%");
, если в строке есть формат:
printf("%.2f%%", 53.2);
Как указано в комментариях, Put
добавляет \ n
к выходу, а fputs
- нет.
Вот так:
printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Как говорили другие, %% будет экранировать%.
Обратите внимание, однако, что вы никогда не должны этого делать:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Всякий раз, когда вам нужно печатать строку, всегда, всегда , всегда печатайте его с использованием
printf("%s", c)
, чтобы встроенный% не вызывал проблем [нарушения памяти, segfault и т. д.]
Обратная косая черта в C используется для экранирования символов в строках. Строки не распознают% как специальный символ, и поэтому в экранировании нет необходимости. Printf - другое дело: используйте %% для вывода одного%.