2015-04-04 2 views
0

У меня есть следующий код. Я не могу определить причину вывода, которую он дает.Невозможно определить причину вывода кода c

char abc[14] = "C Programming"; 

printf("%s\n", abc+abc[3]-abc[4]); 

выход: rogramming

Это вопрос викторины со следующими параметрами: Что бы это напечатать? a) C Программирование b) rogamming c) Ошибка выполнения d) Ошибка компиляции

+0

И почему это нарушает ваши ожидания? – Carcigenicate

+0

Что вы пытаетесь сделать? – teppic

+0

@Carcigenicate Потому что abc [3] и abc [4] должны давать ошибку, поэтому меня путают, если она конкатенирована или что-то еще происходит. – reaper1

ответ

2

Возможно, будет яснее, если я поставлю шаговые камни v3 и v4. Они используются для вычисления смещения в строке из 3 индексов. Поэтому выход печати начинается с abc[3]. Выход

#include <stdlib.h> 
#include <stdio.h> 

int main (int argc, char *argv[]) 
{ 
    char abc[14] = "C Programming"; 
    int v3 = abc[3]; 
    int v4 = abc[4]; 
    printf("%d - %d = %d\n", v3, v4, v3 - v4); 
    printf("%s\n", abc + v3 - v4); 
    return 0; 
} 

Программа:

114 - 111 = 3 
rogramming 
2

Это может вызвано следующим: значение abc[3] является 'г', значение abc[4] является «o'.so значением

abc[3]-abc[4] 

is 'r' - 'o', изменить значение на int3. Поэтому, когда вы используете printf("%s\n", abc+abc[3]-abc[4]);, это означает, что вы p rint эту строку из abc [3]. следующий код покажет вам что-то.

int main() 
    { 
    char abc[14] = "C Programming"; 
    printf("%d\n",abc[3]-abc[4]); 
    printf("%s\n", abc+abc[3]-abc[4]); 

    } 
2

В этом выражении abc+abc[3]-abc[4] есть используется так называемый указатель арифметика.

Имя массива в выражениях преобразуется в указатель на первый элемент массива,

Таким образом, в выражении выше точек ABC на первый символ строки, которая должна 'C'abc + 1 точек в пространстве. abc + 2 указывает на «P». abc + 3 указывает на 'r' и так далее.

выражение аЬс [3] и аЬс [4] преобразуется к типу INT и равному внутренним кодам символов 'r' и 'o' Разность этих кодов равно 3,

Таким образом, выражение abc+abc[3]-abc[4] можно записать как abc + 3 и указывает на четвертый элемент массива, который должен 'r' Так строка, начиная с «г» outputed заявлением

printf("%s\n", abc+abc[3]-abc[4]); 
1

на практически любой платформе (например, один с помощью ASCII), поведение не определено. Итак, ни один из ответов не верен.

abc+abc[3]-abc[4] 

Это выражение равно

abc + 'r' - 'o' 

значения символьных констант зависит от реализации; предполагая систему ASCII, где r и o являются 0x6f и 0x72 соответственно, abc + 0x6f находится вне границ массива abc, что приводит к неопределенному поведению.Обратите внимание, что последующее вычитание, возвращающее результат обратно в границы, не меняет этого; как только достигнуто, невозможно восстановить из неопределенного поведения.

Тем не менее, результат, вероятно, будет такой же, как abc + ('r' - 'o'), который, в системе ASCII, является abc + (0x6f - 0x72), который, в свою очередь, является abc + 3 и, таким образом rogramming выводится, как сообщалось в вопросе.

Смежные вопросы