О, прости, прости. Я думал, что там было написано. GGT (& x1, & x2)) и int GGT (int * x1, int * x2). Я не читаю Кодекс детально, я не прав, извините. :)

у следующий код имеет правильный вывод? int GGT не имеет оператора return, но код все равно работает? Глобальные переменные не установлены.

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

int GGT(int, int);

void main() {
    int x1, x2;
    printf("Bitte geben Sie zwei Zahlen ein: \n");
    scanf("%d", &x1);
    scanf("%d", &x2);
    printf("GGT ist: %d\n", GGT(x1, x2));
    system("Pause");
}

int GGT(int x1, int x2) {
    while(x1 != x2) {
        if(x1 > x2) {
            /*return*/ x1 = x1 - x2;
        }
        else {
            /*return*/ x2 = x2 - x1;
        }
    }
}
 Pascal Bayer10 янв. 2011 г., 09:32
Я получаю предупреждающее сообщение, но меня интересует, почему оно работает, компилятор устанавливает возвращаемое значение, если его нет?
 Oliver Charlesworth10 янв. 2011 г., 09:30
Увеличьте уровень предупреждения прямо на вашем компиляторе, и вы должны получить сообщение ...

Ответы на вопрос(5)

конечно, не работать на всех компиляторах и целевой ОС, даже если он работает на вашей.

Вероятное объяснение состоит в том, что функция, возвращающая int, всегда что-то возвращает, и это обычно содержимое регистра. Вероятно, случается, что регистр, используемый для возвращаемого значения, в вашем случае аналогичен используемому для вычисления последнего выражения перед возвратом из функции (для целей x86, конечно, eax).

При этом оптимизирующему компилятору, обнаруживающему, что нет возврата, разрешено полностью удалить код этой функции. Отныне эффект, который вы видите (может), исчезает при активации более высоких уровней оптимизации.

Я проверил это с помощью gcc:

gcc без оптимизации: ввод 10, 20 -> результат 10

gcc -O1 входы 10, 20 -> результат равен 1

gcc -O2 входы 10, 20 -> результат равен 0

 kriss10 янв. 2011 г., 10:03
Может ли Даунвотер объяснить, во что он верит или не любит?

в то время как clang вставляет «ud2» и приложение вылетает во время выполнения.

если вы используете указатели. Как правило, вы можете вернуть только одно значение с помощью оператора Return, но если вы используете указатели, вы можете вернуть сколько хотите.

scanf ("% d", & x1); там вы даете функции адрес X1, а не значение X1. указатели работает ширина адреса. Вы можете читать книги, научиться работать с указателями.

 VakhoQ10 янв. 2011 г., 09:52
О, прости, прости. Я думал, что там было написано. GGT (& x1, & x2)) и int GGT (int * x1, int * x2). Я не читаю Кодекс детально, я не прав, извините. :)
 Daniel Hershcovich10 янв. 2011 г., 09:38
Но это не имеет ничего общего с вопросом.
 Pascal Bayer10 янв. 2011 г., 09:37
Не думаю, что диапазон переменных также устанавливается, если я работаю с указателями
Решение Вопроса

для x86 возвращаемое значение этой функции должно бытьeax регистр. Все, что было там, будет считаться возвращаемым значением вызывающей стороной.

Потому чтоeax используется как регистр возврата, он часто используется как вызываемый регистр, потому что его не нужно сохранять. Это означает, что вполне возможно, что он будет использоваться как любая из локальных переменных. Поскольку оба они равны в конце, более вероятно, что правильное значение останется вeax.

 Anjaneyulu17 янв. 2017 г., 01:16
где eax регистр ?? ЦП регистрирует ??

который "случайно" также используется этим компилятором для хранения результата арифметических операций (или, по крайней мере, вычитания). Вы можете проверить это, посмотрев сборку, сгенерированную вашим компилятором. Я согласен с Криссом - вы не можете предполагать, что так будет всегда, поэтому лучше явно указать возвращаемое значение.

 Pascal Bayer10 янв. 2011 г., 09:42
Не думаю, что это будет работать всегда, но меня интересовало, почему это работает в этом случае. Спасибо за Ваш ответ!

Ваш ответ на вопрос