2016-05-21 20 views
-5

sah ich einige einenWarum muss diese C++ Funktion nicht zurückgegeben werden?

int r, odd_divisors(int a, int b) { 
    r = sqrt(b) + 1; 
    r -= sqrt(a); 
} 

AFAIK diesen Code schreiben, wird der Compiler automatisch return 0; am Ende dieses Codes hinzufügen, aber in diesem Fall gibt es den Wert von r. Könnte mir bitte jemand helfen, zu erklären, warum das passiert. Vielen Dank.

UPDATE: Diese Funktion funktioniert tatsächlich in dieser Codefights-Site: https://codefights.com/challenge/eu4zLJDcv88B2mcCp. Sie können nach sir_ementaler Lösung suchen.

UPDATE 2: Danke für alle, die darauf hingewiesen, diese Funktion ist ill Format. Ich wusste, dass. Der Grund, warum ich hier gefragt habe, ist, dass es die Lösung des Gewinners auf der Seite ist, die ich im vorherigen Update erwähnt habe. Es sieht für mich so aus, dass Codefights dem Compiler ein anderes Feature hinzufügen müssen.

+6

Der Compiler wird keine 'return 0;' hinzufügen. – juanchopanza

+0

Welchen Compiler benutzen Sie? [Es kompiliert nicht auf gcc] (https://ideone.com/3tmEio) – Rakete1111

+0

Ich weiß nicht, welcher Compiler. Dieser Code befindet sich in der Codefight-Site. – sahara108

Antwort

2

Die "implizite int" -Regel, die Sie möglicherweise aus Vor-Standard C kennen, gilt nicht für C++. Dies ist ein ungültiger Code.

Korrigieren Sie Ihren kaputten Code.

+0

Auch C89 hat nicht die implizite int-Regel, wie hier [http://stackoverflow.com/questions/10079089/implicit-in-return-value-of- c-function/10079180 # 10079180), es ist undefiniertes Verhalten. –

+0

Ich weiß, es ist undefiniertes Verhalten. Aber es funktioniert tatsächlich in der Verbindung, die ich zur Verfügung stellte. Möglicherweise verwendet diese Seite einen benutzerdefinierten Compiler – sahara108

+0

Ich dachte, die Regel wurde nur mit C99 entfernt - ich habe mich vielleicht geirrt. In jedem Fall ist es eine sehr schlechte Idee, sich darauf zu verlassen. –

0

Der Code, den Sie gepostet haben, ist nicht legal C++, aber es ist sehr nah an legal. Die folgende ist legal:

// Example program 
#include <iostream> 
#include <string> 
#include <math.h> 

int r, odd_divisors(int a, int b); 
int odd_divisors(int a, int b) { 
    r = sqrt(b) + 1; 
    r -= sqrt(a); 
    return 0; 
} 

int main() 
{ 
    odd_divisors(16,25); 
    std::cout << "Hello, " << r; 
} 

Es gibt zwei Dinge hier los ist. Erstens können Sie ein int definieren und eine Funktion in derselben Anweisung deklarieren, aber Sie können die Funktion nicht definieren. Zulassen ist dies eine offensichtliche Compiler-Erweiterung.

Zweitens ist die Rückgabe eines Werts aus einer Funktion zur Rückgabe von Werten ein undefiniertes Verhalten. Dass kann einen Crash bedeuten - aber es kann auch bedeuten, genau das zu tun, was Sie erwarten. Wenn Sie nicht versuchen, den Wert aus der Funktion zu verwenden, ist es sehr wahrscheinlich (aber nicht sicher), dass nichts passiert.

Es ist natürlich viel sauberer zu machen odd_divisors eine Void-Funktion sein, oder besser noch, es den Wert zurückgeben und keine statische überhaupt verwenden.

+0

IMO, eine bessere Lösung wäre, die 'r' Deklaration in die Funktion zu verschieben und' return' zu ändern, um die 'r' Variable zurückzugeben. –

+0

Das war mein besserer Vorschlag. –

Verwandte Themen