17

これは 2 から 8 までの累乗を出力する小さなプログラムです。しかし、8 を超えても終了しません。理由を説明してください。

#include <stdio.h>
#include <unistd.h>
int main(void)
{
        unsigned int i=1;
        while(1) {
                i = i<<1;
                printf("i = %d\n",i);
                if(i==(2^8))
                        break;
                sleep(1);
        }
        printf("Exited While loop.. \n");
        return 0;
}

i = 2^8 の場合、ループは終了していません。私の出力は次のようなものです:

i = 2
i = 4
i = 8
i = 16
i = 32
i = 64
i = 128
i = 256
i = 512 (Should have Exited here. But the program is continuing. Why?)
i = 1024
i = 2048
i = 4096....

編集 :

答えてくれてありがとう ^ は XOR 演算子です。しかし、現在、以下のコードは奇妙な動作をしています。説明してください。

#include <stdio.h>
int main(void)
{
        if((2)^8 == 1<<8) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}

上記の関数プログラムは true を出力します。

4

6 に答える 6

44

C では、^ 演算子は XOR (ビットごとの排他的論理和) を意味します。

2 の 8 乗を取得するには、ループを使用するか (ループ内で res *=2)、math.h で pow 関数を丸める必要があります (math.h 関数は float を返すことに注意してください。 t は整数に等しい)。

もちろん、最も簡単な方法はビットごとのシフトです。

編集セクションについて:

演算子優先度のすばらしい世界へようこそ。== は ^ よりも優先順位が高いため、条件式は 2^0 と評価されます。これは 2 であり、これは true です。

機能させるには、括弧を追加する必要があります。

if ( (2^8) == (1<<8) ) ...
于 2012-07-23T07:08:56.877 に答える
12

問題は、累乗ではなく^、ビット単位のXOR演算子であることです。2^8ビット形式で説明しましょう。

2 = 0010
8 = 1000
======== xor
10= 1010

そのため、xor をビットごとに適用した結果は 10 になり、それは決して起こらないため、ループが終了することはありません。pow(2,8)代わりに and を使用して整数に丸めると、単体テストを機能させることができます。

別の情報として、この例ではおそらくそうではありませんが、浮動小数点値を扱うときは厳密な等式を避ける方が良いです。イプシロンと比較する方が良いです。

あなたの編集のために: これで優先順位を確認してください:

if((2^8) == (1<<8))

予想どおり、これは false を返します。

于 2012-07-23T07:09:33.603 に答える
6

2^8です2 XOR 8。256 ではなく 10 です。したがって、ループは停止しません。(1<<8)おそらく、具体的には または 256に対してチェックする必要があります。

于 2012-07-23T07:09:25.583 に答える
3

^は c のべき乗ではなく、 を意味しXORます。2^8==10 となり、このコードでは i と等しくなりません。

于 2012-07-23T07:10:17.423 に答える
1

^はビット単位のXORであり、探している関数はmath.hのpowです:)

于 2012-07-23T07:11:39.883 に答える
1

あなたの編集セクションのために

#include <stdio.h>
int main()
{
        if((2^8) == (1<<8)) {
                printf("True.. \n");
        } else {
                printf("False..!!");
        }
        return 0;
}

Falseを返します。

于 2012-07-23T07:36:37.860 に答える