Коли керуючий потік з кінця функції без повернення, чому все ще повертається значення?

#include 

int func(int &a,int &b){
    if (a>b){
        return 1;
    }
}

int main(){
    int a=4,b=12;
    std::cout<<

Я думаю, що помилка часу виконання повинна відбуватися, тому що a менше, ніж b, і оператор return пропускається. Але насправді це виводить значення b незалежно від того, як я змінюю значення b. Скажіть, будь ласка, чому?

3
Це UB Я вважаю. Потрібно отримувати попередження "Не всі кодові шляхи повертають значення".
додано Автор CinCout, джерело

5 Відповіді

він повинен виявити помилку часу виконання

Це не так. Поведінка не визначено.

5
додано

Виходячи з не- void функції без повернення є невизначеною поведінкою, в цьому випадку ваша програма або час виконання "не повинні".

5
додано

Це відбувається тому, що результат функцій (якщо тип повернення - int) передається за допомогою реєстру rax процесора. Ключове слово return розміщує аргумент у цьому реєстрі та повертається до функції, що викликає. Але існує також неявне ключове слово return в кінці будь-якої функції в C/C ++ (якщо немає явного return , розміщеного програмістом). Ось чому ця функція повертає потік керування до функції абонента.

Але вміст реєстру rax слід розглядати в цьому випадку як випадковий, тому що компілятор може використовувати його для будь-якої змінної або навіть повністю ігнорувати.

4
додано
Це не потрібно. Це цілком відповідає простому запуску виконання того, що відбувається після цієї функції в бінарному зображенні
додано Автор Caleth, джерело
Дякую! Насправді програма виводить значення b незалежно від того, як я змінюю значення b (до тих пір, поки a
додано Автор Jerry Xu, джерело

Не слід припиняти попередження компілятора!

GCC говорить:

main.cpp.

Як вже згадували інші: Ваша програма має UB! Так що читайте попередження і виправляйте вашу програму відповідно!

він повинен виявити помилку часу виконання

І немає необхідності в помилках часу виконання, оскільки помилка видно під час компіляції! Основна мова взагалі не має помилок під час виконання. Якщо під час виконання програми ви бачите деякі повідомлення про помилки, вони надходять з коду бібліотеки, подібного до назви "припинити" з винятку або з іншого.

Це добре, якщо всі попередження включені, а також іноді корисно для запуску різних компіляторів над кодом, щоб отримати більшість попереджень можливо.

Для gcc можна додати:

-Wall -pedantic -Wextra

That enables a lot of warnings, but not all. There are still some warnings which are not addressed like: -Wsuggest-override

3
додано

У C ++, якщо функція оголошена для повернення значення, але це не так, це невизначена поведінка

1
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147