C ++: я решал вопрос, когда вдруг заметил, что код скомпилирован без оператора return - PullRequest
1 голос
/ 06 ноября 2019

Visual Studios и даже Codechef компилируют мой код с отсутствующим оператором возврата.

Я решил какой-то вопрос конкурентного программирования и заметил, что моя программа компилируется без оператора возврата в функции. Я написал простую функцию и не упомянул ни одного оператора возврата, и программа отлично компилируется.

Вот код

#include <iostream>
using namespace std;

int add(int x, int y)
{
    int c = x + y;
}

int main() {

    int a = add(1, 2);
    cout << a;
    return 0;
}

Я ожидал ошибку, которую не получили заставил меня задуматься, что не так с моим кодом (конечно, не выше). И в программе выше я получаю вывод 0, который я не понимаю, как?

Ответы [ 2 ]

6 голосов
/ 06 ноября 2019

Функция, которая не возвращает ничего, как ожидалось, имеет неопределенное поведение .

Перетекание конца функции, возвращающей значение (кроме main) без оператора return, является неопределенным поведением.

Именно поэтому вы никогда не должны игнорировать предупреждения. /Wall или /w4 - это флаг, который вам нужен в visual studio.

0 голосов
/ 06 ноября 2019

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

int c = a + b;
01001FD8  mov         eax,dword ptr [a]  
01001FDB  add         eax,dword ptr [b]  
01001FDE  mov         dword ptr [c],eax  
    return c;
01001FE1  mov         eax,dword ptr [c]  

}
01001FE4  pop         edi  
01001FE5  pop         esi  
01001FE6  pop         ebx  
01001FE7  add         esp,0CCh  
01001FED  cmp         ebp,esp  
01001FEF  call        __RTC_CheckEsp (01001294h)  
01001FF4  mov         esp,ebp  
01001FF6  pop         ebp  
01001FF7  ret  
...