2015-10-17 2 views
-5

1)Необходимо понимать поведение Printf

char* fun() 
{ 
    return "awake"; 
} 
int main() 
{ 
    printf("%s",fun()+ printf("I see you")); 
    return 0; 
} 

выход :: Я вижу youee вы

int main() 
{ 
    printf("%s",5+printf("I see you")); 
    return 0; 
} 

выход :: Продолжительность врезаться

1) Почему и сценарий, как различное поведение?

2) может ли кто-нибудь объяснить, почему «бодрствование» не печатается в первом PRINTF?

3) сценарий 1 зависит от компилятора?

+0

Почему вы ожидаете, что оба будут иметь одинаковое поведение? – juanchopanza

+2

@Marged Нет, я так не думаю. Это строковый литерал. – juanchopanza

+0

@juanchopanza Но строка, возвращаемая функцией, игнорируется. – ameyCU

ответ

4

Этот

printf("%s",fun()+ printf("I see you")); 

добавляет результат fun() (адрес вашего "awake" строкового литерала) в результате вызова printf(), которая является целым числом 9, количество напечатанных символов. Это адрес символа плюс целочисленное смещение - вполне законное - и это просто несколько символов в строковом литерале "I see you", поэтому он печатает конец строки `` I see you '.

Это

printf("%s",5+printf("I see you")); 

пытается напечатать как NUL-строку, оканчивающуюся независимо находится на на адрес виртуальной памяти 14, который, вероятно, даже не отображается в адресное пространство процесса.

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