2016-05-21 5 views
-5

、コンパイラが自動的にこのコードの末尾にreturn 0;が追加されますが、この場合には、それはrの値を返します。誰かが私になぜこれが起こるのかを説明するのを助けてくれますか?ありがとう。なぜこのC++関数が復帰する必要はありませんか?私はいくつかのいずれかが、このコードを書く</p> <pre><code>int r, odd_divisors(int a, int b) { r = sqrt(b) + 1; r -= sqrt(a); } </code></pre> <p>私の知る限りを見

更新: この関数は、このCodefightsサイトで実際に動作します:https://codefights.com/challenge/eu4zLJDcv88B2mcCpsir_ementalerの解決策を確認できます。

UPDATE 2:皆のための おかげで、この機能を指摘病気フォーマットです。私はそれを知っていた。私がここで尋ねた理由は、それが以前のアップデートで言及したサイトの勝者の解決策であるからです。 Codefightsは他の機能をコンパイラに追加する必要があると私は思っています。あなたは事前に、標準Cから知っている可能性があり

+6

コンパイラは 'リターン0を追加しません;'。 – juanchopanza

+0

どのコンパイラを使用していますか? [それはgccでコンパイルされません](https://ideone.com/3tmEio) – Rakete1111

+0

私はどのコンパイラを知っていません。このコードはCodefightサイトにあります。 – sahara108

答えて

2

「暗黙のint型」のルールは、C++には適用されません。 これは無効なコードです。

はあなたの壊れたコードを修正してください。

+0

C89でも暗黙のintルールはありません[ここ](http://stackoverflow.com/questions/10079089/implicit-int-return-value-of- c-function/10079180#10079180)、未定義の動作です。 –

+0

私はそれが未定義の動作であることを知っています。しかし、それは私が提供したリンクで実際に動作します。そのサイトがカスタムコンパイラを使用している可能性があります – sahara108

+0

私はルールがC99でのみ削除されたと思っていました - 私は間違っているかもしれません。いずれにせよ、それに頼ることは非常に悪い考えです。 –

0

あなたが投稿したコードは、法的C++ではありませんが、それは法的に非常に近いです。次は法的です:

// 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; 
} 

ここで起こって二つのものがあります。まず、intを定義して同じ文で関数を宣言できますが、関数を定義することはできません。これを可能にするのは明らかなコンパイラの拡張です。

第二に、値を返す関数から値を返すために失敗すると、未定義の動作です。そのがクラッシュを意味しますが、それはあなたが期待していることを正確に行うことを意味することもあります。関数の値を使用しようとしないと、非常に可能性がありますが(確かではありません)、何も起こりません。

もちろん、odd_divisorsをvoid関数にする方がはるかに洗練されていますし、より良い方法として、値を返すようにし、静的関数をまったく使用しないようにすることもできます。

+0

IMO、もっと良い解決策は 'r'宣言を関数に移動し、' r'変数を返すよう 'return'を変更することでしょう。 –

+0

それは*私の「より良い」提案でした。 –

関連する問題

 関連する問題