2015-06-10 2 views
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; 
    } 
+0

Подумайте о полученной строке, если вы делаете 's + 2' (это то же самое, что и' & s [2] '). Затем подумайте о том, что произойдет, если вы поместите это как строку формата в 'printf'. –

+0

Как вы думаете, 'printf ("% d% d ", 9, 8, 5)' prints? – cubrr

ответ

3

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 будет, за исключением двух целых чисел для чтения из третьего и один будет просто - игнорировать.

+0

Этот ответ более техничен и удобен для большинства пользователей. И еще полнее. –

+0

.. и более одобренный, в чем ваш смысл? – Malina

2

Выражение s+2 образно говоря перемещает указатель s (в выражениях десигнаторов массива преобразуются в указатели на их первые элементы) две позиции вправо. Таким образом, строка формата в операторе PRINTF будет выглядеть

"%d%d" 

потому что expressiom s+2 указывает на третий символ строки "%d%d%d" В результате заявления

printf(s+2,a,b,c); 

будет выводить только два первых аргумента а и Ь, потому что указанная подстрока содержит только два спецификатора формата, и вы получите

98 

Если f или пример, который вы будете использовать выражение s + 4 в printf вызова вы получите только

9 
+0

@haccks Что значит? –

+0

Ничего. Ваше изменение делает этот комментарий недействительным. – haccks

+0

@haccks У меня обычно есть проблема, чтобы найти правильные английские слова для моих мыслей. :) –