C программные строки Пример, как результат: 98?C program Strings Пример, как результат: 98?
#include <stdio.h>
int main()
{
char s[]="%d%d%d";
int a=9,b=8,c=5;
printf(s+2,a,b,c);
return 0;
}
C программные строки Пример, как результат: 98?C program Strings Пример, как результат: 98?
#include <stdio.h>
int main()
{
char s[]="%d%d%d";
int a=9,b=8,c=5;
printf(s+2,a,b,c);
return 0;
}
string + x
операция называется Pointer Arithmetic. Таким образом, вы предоставляете ссылку на математически рассчитанную область памяти и по семантике, это эквивалентно &string[x]
Что на самом деле происходит за счет: (&string + (x * sizeof(*string)))
, поэтому это очень специфическое понятие, когда оно применяется к указателям. Это означает, что массивы также распадаются на указатель на первый элемент.
Что касается кода, то есть следующая строка:
char s[]="%d%d%d";
И передается как строку формата для Printf, два байта после этого, что явно дает ссылку на "%d%d"
Таким образом:
printf(s+2,a,b,c);
позже разобрано как:
printf("%d%d",a,b,c);
printf будет, за исключением двух целых чисел для чтения из третьего и один будет просто - игнорировать.
Этот ответ более техничен и удобен для большинства пользователей. И еще полнее. –
.. и более одобренный, в чем ваш смысл? – Malina
Выражение s+2
образно говоря перемещает указатель s (в выражениях десигнаторов массива преобразуются в указатели на их первые элементы) две позиции вправо. Таким образом, строка формата в операторе PRINTF будет выглядеть
"%d%d"
потому что expressiom s+2
указывает на третий символ строки "%d%d%d"
В результате заявления
printf(s+2,a,b,c);
будет выводить только два первых аргумента а и Ь, потому что указанная подстрока содержит только два спецификатора формата, и вы получите
98
Если f или пример, который вы будете использовать выражение s + 4
в printf
вызова вы получите только
9
@haccks Что значит? –
Ничего. Ваше изменение делает этот комментарий недействительным. – haccks
@haccks У меня обычно есть проблема, чтобы найти правильные английские слова для моих мыслей. :) –
Подумайте о полученной строке, если вы делаете 's + 2' (это то же самое, что и' & s [2] '). Затем подумайте о том, что произойдет, если вы поместите это как строку формата в 'printf'. –
Как вы думаете, 'printf ("% d% d ", 9, 8, 5)' prints? – cubrr