2013-11-15 5 views
2

рассмотрим следующий код:возвращение; что возвращает это утверждение?

#include <stdio.h> 

int main() 
{ 
    int a ; 
    a = message() ; 
    printf("--%d",a); 
} 

message() 
{ 
    printf("--%d",printf ("\nViruses are written in C")); 
    return ; 
} 

Я получаю выход, как: (в GCC)

Вирусы написаны с - 25--4

Мое объяснение: return ; оператор возвращает значение в Аккумуляторе, значение, возвращаемое последним printf, хранится в аккумуляторе ... это правильно или нет?

+0

Ваши разъяснения неверны. В C нет «аккумулятора», и стандарт не позволяет пустующему возврату возвращать что-либо полезное. Компиляция с ошибками покажет, что это неверный код, и эффект, который вы получаете, - это неопределенное поведение. – usr2564301

+1

@ Jongware: замените «eax» на Intel 32-bit »для« Accumulator »и добавьте предостережения о неопределенном поведении, и объяснение в значительной степени правильное для компилятора, который использует OP. – RichieHindle

+0

@RichieHindle: ни 'eax', ни« Intel »не являются частью стандарта C (* any * из них, так как есть пара). – usr2564301

ответ

0

Он ничего не возвращает. Это прекратит вашу функцию. Но поскольку ваша функция не имеет типа возврата в C89, его тип возврата неявно преобразуется в int, но это не является законным в C99 и последним, и это вызовет неопределенное поведение.

Если не- void функция достигает конца своего тела - то есть, он не может выполнить return statement-- поведение программы не определено, если он пытается использовать значение, возвращаемое функцией.

Некоторые компиляторы будут выдавать предупреждение:

control reaches end of non-void function 
3

поведение не определено.

Причина вы видите на 4 является то, что ваш код не произошло перезаписать регистр, используемый для возврата значений из функций (например, eax на 32-битной Intel) между printf, который печатает --%d в message (которая распечатана четыре символа --25) и окончательный printf в main.

1

Вы вызываете undefined behavior, не возвращая ничего из функции возврата значения. Если мы посмотрим на draft C99 standard разделе 6.8.6.4Ответное заявление говорит:

[...] Ответное заявление без выражения должно появляться только в функции , возвращение типа является недействительным.

Вы действительно должны иметь никаких ожиданий относительно того, как это должно работать, но вы можете сделать несколько хороших догадки, как Deep C презентации демонстрирует в нескольких разделах, но я никогда не делал бы все это в производственной среде.

Если у вас предупреждений включен, то вы должны были увидеть несколько информационных сообщений, например gcc предоставляет следующие предупреждения:

warning: implicit declaration of function ‘message’ [-Wimplicit-function-declaration] 
warning: return type defaults to ‘int’ [enabled by default] 
warning: ‘return’ with no value, in function returning non-void [enabled by default] 

Вы также полагаться на неявные типы возвращаемых значений больше не разрешается, так как C99, но компиляторы, как gcc поддерживают их даже в режиме C99. Так что, если это так, то message будет иметь неявный тип возврата int.

+0

Спасибо за ссылку на слайды Deep C - очень интересно! – RichieHindle

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