为什么std :: bitset :: at()抛出out_of_range?

Ann*_*inn 1 c++ algorithm debugging stl exception

这让我困扰了几个小时,因为我在数学或代码中看不到任何问题.(尽管盯着它看,并一遍又一遍地努力确定.)我希望大家可以帮助我,这是我的代码:

#define SOLVE_POSITION(x, y, z) ( z*16  +  y*4  +  x )

std::bitset<64> block;
block.reset();

for(int z = 0; z < 4; ++z){
    for(int y = 0; y < 4; ++y){
        for(int x = 0; x < 4; ++x){

            if(block.at(SOLVE_POSITION(3-x, y, 3-z))){  //<-- call to at() throws 'out_of_range'

                // do stuff
            };
        };
    };
};
Run Code Online (Sandbox Code Playgroud)

z为0时,两个最内部for循环完全运行它们(总共16次传递.)但是,一旦z变为1,那就是从std :: bitset <64> :: at()中抛出异常的时候.

的值z,y,x分别为 1,0,0在那一刻.

你能告诉我这里发生了什么导致这个例外吗?提前致谢!

fli*_*ght 7

宏!你必须非常小心:

你定义:

#define SOLVE_POSITION(x, y, z) ( z*16  +  y*4  +  x )
Run Code Online (Sandbox Code Playgroud)

所以当你这样做时:

SOLVE_POSITION(3-x, y, 3-z)
Run Code Online (Sandbox Code Playgroud)

它扩展到:

( 3-x*16 + y*4 + 3-z )
Run Code Online (Sandbox Code Playgroud)

而且由于运算符优先级,3-x*16将是不正确的!你需要这样做:

#define SOLVE_POSITION(x, y, z) ( (z)*16  +  (y)*4  +  (x) )
Run Code Online (Sandbox Code Playgroud)

以便它正确扩展到:

( (3-x)*16 + (y)*4 + (3-z) )
Run Code Online (Sandbox Code Playgroud)

正如所料.