0

1-N から異なる可能なサブセットを見つけるために、このプログラムを作成しました。このコードは N=5 までは問題なく動作しますが、それ以降は間違った出力になります。バグは何ですか?

#include<iostream>
#include<cstdio>
using namespace std;
int main(){
    int n, i,j ;
    cin>>n;
    int limit = 1<<n;
    int arr[limit];
    for( i=0; i<limit; i++)
        arr[i] = i+1;
    for( i=0; i<limit; i++){
        for( j=0; j<limit; j++){
            ( i & 1<<j)? printf("%d\t", arr[j]) : 0;
        }
        cout<<endl;
    }
    cout<<(1<<n)<<endl;
    return 0;
}
4

1 に答える 1

0
int limit = 1<<n;

だからn > 5、あなたは持っていlimit > 32ます。

int arr[limit];

あなたの実装には拡張機能として VLA があると想定していますが、これは標準の言語ではありません。

for( i=0; i<limit; i++)
    arr[i] = i+1;
for( i=0; i<limit; i++){
    for( j=0; j<limit; j++){
        ( i & 1<<j)

の場合j >= 32、 の幅よりもさらにシフトしますint(おそらく、intは 32 ビット幅であり、コードが に対して機能しないという観測によってサポートされています)n > 5。これは未定義の動作であり、正しい出力。

             ? printf("%d\t", arr[j]) : 0;
    }
于 2013-02-25T18:38:44.100 に答える