1

次のプログラムは、数値の余りを計算して削除し、計算された余りの合計を加算して表示します。

#import <Foundation/Foundation.h>
int main (int argc, char * argv[]) {
    @autoreleasepool {
        int number, remainder, total;
        NSLog(@"Enter your number");
        scanf("%i", &number);

        while (number != 0)
        {
            remainder = number % 10;
            total += remainder;
            number /= 10;
        }
        NSLog(@"%i", total);    
    }
    return 0;
}

私の質問は次のとおりです。

  1. 数が0に等しくない限り、プログラムが続行するように設定されているのはなぜですか?余りが0に等しくない限り、それを続けるべきではありませんか?

  2. 余りはどの時点で?の値から破棄されますnumberか?number -= remainderなぜ前に声明がないのn /=10ですか?

[ボーナス質問:Objective-Cは理解しやすくなりますか?]

4

2 に答える 2

2
  1. 余りを使用する代わりにまで続ける理由はnumber != 0、入力が正確に割り切れる場合10、適切な出力(10進数の合計)が得られないためです。

  2. 余りは整数除算のために削除されます。整数は小数点以下の桁数を保持できないため、16を10で割ると、1.6にはならず、1になります。

そして、はい、Objective-Cは時間の経過とともに簡単になります(ただし、補足として、これはObjective-Cの機能をまったく使用しないため、基本的にはCでNSLog呼び出します)。

出力は常に期待するものではないことに注意してください。ただし、C / ObjCの場合と同様に、(DやJSなどの言語とは異なり)変数は常に設定値に初期化されるとは限りません(この場合、 0)。これにより、UBが将来的に発生する可能性があります。

于 2012-08-30T22:16:35.860 に答える
0
  1. 余りがゼロになることは決してないので、数値がゼロに等しくないかどうかをチェックします。入力値として5を入力すると、ループの最初の余りは5に設定され(5%10 = 5であるため)、5/10 = 0.5であるため、数値はゼロになり、intは格納されません。浮動小数点値であるため、.5は切り捨てられ、numberの値はゼロになります。
  2. 余りは、このコードの数値の値から削除されません。モジュロ演算子が何をするかについて混乱するかもしれないと思います(この説明を参照)。

ボーナスの答え:プログラミング言語を学ぶことは最初は難しいですが、長期的には非常にやりがいがあります(それに固執する場合)。あなたが最初の後に学ぶそれぞれの新しい言語は、あなたが一般的なプログラミング構造と実践を理解するので、おそらくまた学ぶのがより簡単でしょう。あなたの努力に最高の幸運を!

于 2012-08-30T22:22:48.793 に答える