Другие языки программирования и технологии
ключевое слово return в языке Си
Я знаю что return возвращает значение функции, но не совсем понимаю как это. объясните поподробнее и желательно как можно понятней для начинающего программиста. И что такое return 1 и return 0?
есть функция: ПОЧТОВЫЙ ЯЩИК ПОЧТОВОГО ОТДЕЛЕНИЯ
вы ей передаёте параметр; ПИСЬМО, в кротом содержится просьба об удвоении зарплаты
есть return: ПОЧТАЛЬОН
есть возвращаемое значение: УВЕДОМЛЕНИЕ, о решении вашей просьбы
есть переменная: ВАШ ПОЧТОВЫЙ ЯЩИК, в который почтальон положит уведомление
Как-то так...
int post(char* message) { if (strlen(message)) return 0; else return 0; }
...
int result = post("Дай миллиончик!");
вы ей передаёте параметр; ПИСЬМО, в кротом содержится просьба об удвоении зарплаты
есть return: ПОЧТАЛЬОН
есть возвращаемое значение: УВЕДОМЛЕНИЕ, о решении вашей просьбы
есть переменная: ВАШ ПОЧТОВЫЙ ЯЩИК, в который почтальон положит уведомление
Как-то так...
int post(char* message) { if (strlen(message)) return 0; else return 0; }
...
int result = post("Дай миллиончик!");
Вот тебе вернули 1 тысячу и 0 тысяч. Почувствуешь разницу?
"Функция возвращает значение" означает, что конструкция
x=f(a);
присвоит x то, что было возвращено функцией. Т. е. если было return 0, то x станет равным 0.
x=f(a);
присвоит x то, что было возвращено функцией. Т. е. если было return 0, то x станет равным 0.
при объявление функции, мы указываем тип возвращаемого значения
int func() bool func() и тп. что указали то мы обязаны и вернуть. Нельзя вернуть указатель на массив - причина простая, память освобождается после выхода переменной из зоны видимости. Исключение являются динамически созданные массивы. Когда пишут return 1 0 и тд. Используют чтобы вернуть информацию об удачи или не удачи выполнения функции. Т
int func() bool func() и тп. что указали то мы обязаны и вернуть. Нельзя вернуть указатель на массив - причина простая, память освобождается после выхода переменной из зоны видимости. Исключение являются динамически созданные массивы. Когда пишут return 1 0 и тд. Используют чтобы вернуть информацию об удачи или не удачи выполнения функции. Т
Хулиган_05 .
Указатель на массив вернуть можно. Нельзя возвращать указатель на локальную переменную (массив в т.ч.), вернее можно, но результат будет неопределенным.
Язык Си сделали для того, чтобы не мучиться с ассемблером. Однако, если вы изучаете Си стоит немного изучить ассемблер (хотя бы для x86).
Приведу пример с некоторыми упрощениями (в реальности всё гораздо страшнее) .
Как вам должно быть известно, компилятор "транслирует" исходный код в набор инструкций целевого процессора (объектный код, т. е. просто набор команд для процессора) .
Допустим, мы пишем:
// функция
int someFunction() {
int i = 0;
i++;
return i;
}
// её вызов
someVariable = someFunction();
Компилятор это превратит в что-то наподобие этого:
// функция
someFunction:
add sp, 4; поднимаем стек на 4 байта для локальной переменной i
mov [sp], 0; записываем значение
inc [sp] ; инкрементируем
;; У нас есть "договорённость": функции возвращают значение через
;; регистр ax
mov ax, [sp];
sub sp,4; возвращаем стек в исходное состояние
ret; перейти назад к месту вызова (восстанавливаем IP из стека)
// вызов
call someFunction; сохранить IP в стеке и перейти по метке (адресу)
mov someVariable, ax; записываем результат вызова в переменную
Тут есть неточности, но самое главное: функция возвращает значение через определённый регистр (eax, ax), либо каким-то другим способом.
http://pastebin.com/4j8PQh0r
Приведу пример с некоторыми упрощениями (в реальности всё гораздо страшнее) .
Как вам должно быть известно, компилятор "транслирует" исходный код в набор инструкций целевого процессора (объектный код, т. е. просто набор команд для процессора) .
Допустим, мы пишем:
// функция
int someFunction() {
int i = 0;
i++;
return i;
}
// её вызов
someVariable = someFunction();
Компилятор это превратит в что-то наподобие этого:
// функция
someFunction:
add sp, 4; поднимаем стек на 4 байта для локальной переменной i
mov [sp], 0; записываем значение
inc [sp] ; инкрементируем
;; У нас есть "договорённость": функции возвращают значение через
;; регистр ax
mov ax, [sp];
sub sp,4; возвращаем стек в исходное состояние
ret; перейти назад к месту вызова (восстанавливаем IP из стека)
// вызов
call someFunction; сохранить IP в стеке и перейти по метке (адресу)
mov someVariable, ax; записываем результат вызова в переменную
Тут есть неточности, но самое главное: функция возвращает значение через определённый регистр (eax, ax), либо каким-то другим способом.
http://pastebin.com/4j8PQh0r
Похожие вопросы
- Семь управляющих структур. Два способа их объединения. 28 ключевых слов. Так почему же язык Си считают сложным?
- Почему язык СИ такой сложный?
- Как работает return в языке программирования Java?
- Как продвигать в топ конкретное ключевое слово?.
- Программирование на языке СИ с использованием подпрограммы-функции
- Программирование на языке Си. Нужна небольшая помощь.
- Условие при котором отбираются слова 5 или более символов. Язык Си.
- какую программу лучше использовать для программирования на языке Си?
- Pascal. Ключевые слова и операторы - это одно и тоже?
- Вопросы по языку СИ