假设有一个'bool'数组,'a [n] ==( - 1)'是否真的可以?

Phe*_*nix 2 c++ data-structures

我有一些代码,我有两个BOOL数组a[]和b[]大小相同N.

it是一个迭代器指向的索引a,可能之间0至N-1

if( (a[*it] == 1 && index>*it) ||
    (a[index]==b[index] && a[index]==-1 && index!=0))
{
      final = !final;
}
Run Code Online (Sandbox Code Playgroud)

对我来说,if条件的第二部分|| (a[index]==b[index] && a[index]==-1 && index!=0)永远不会是真的,因为a[index]不等于-1任何index,它将是1或者0...所以我认为我可以删除那部分,但结果会改变,对于某些特定的条件(我不知道条件,它是一个在线判断类型网站,我不知道他们的测试用例是什么).

我if在程序中添加了另一个测试条件,

if(a[index]==-1){
cout<<"its True";
}
Run Code Online (Sandbox Code Playgroud)

但"它的真实"从未印刷过.

为什么会这样?

编辑:添加实际代码,程序的目的是处理类型的查询

set_a INDEX VALUE

set_b INDEX VALUE

它将相应的索引(0..n-1)设置为值(0或1)和

get_c index 打印出c[index]C = A + B的地方

注意,INDEX从LSB侧,我A和B的MSB中存储LSB阵列的a和b

代码:

int main(int argc, char * argv[])
{
  int n, q;
  char c;
  bool a[100005] = {0}, b[100005] = {0};
  VanEmdeBoasTree equals;
  cin>>n;
  cin>>q;

  for(int i=0;i<n;i++){
    cin>>c;
    if(c=='1')
      a[n-i-1] = true;
  }
  for(int i=0;i<n;i++){
    cin>>c;
    if(c=='1')
      b[n-i-1] = true;
    if(a[n-i-1] == b[n-i-1]){
      equals.insert(n-i-1);
    }
  }

  string query;
  int index, val, lastval;
  for(int i=0;i<q;i++){
    cin>>query;
    cin>>index;
    if(query[4] == 'a'){
      cin>>val;
      if(a[index] != val){
        a[index] = val;
        if(val == b[index]){
          equals.insert(index);
        }else{
          equals.erase(index);
        }
      }
    }else if(query[4] == 'b'){
      cin>>val;
      if(b[index] != val){
        b[index] = val;
        if(a[index] == val){
          equals.insert(index);
        }else{
          equals.erase(index);
        }
      }
    }else if(query[4] == 'c'){
      int final = 0;
      if(index >n-1){
        if(equals.size() > 0){
          int last = (*(equals.predecessor(n+1)));
          if(a[last] == 1){
            final = 1;
          }
        }
      }else{

        if(equals.size() > 0 && index>0){
          VanEmdeBoasTree::const_iterator it = equals.predecessor(index);
          final = (a[index] + b[index])%2;
          if( (a[*it] == 1 && index>*it) || (a[index]==b[index] && a[index]==-1 && index!=0)){
            final = !final;
          }

        }else{
          final = (a[index] + b[index])%2;
        }

      }
      cout<<final;
    }
  }

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

Arm*_*yan 5

如果a确实是一个bool数组,那么除非你越界a[i]==-1将永远屈服false.毫无疑问.在另一方面,如果你去出界,则行为是不确定的意思,一切都可能发生,包括一个布尔值计算到-1.

此外,有可能a是一个BOOL数组而不是bool.BOOL可能是typedef'或#defined int.

更新:由于OP维护数组是类型的bool并且绝对没有溢出的可能性(让我假装一段时间我相信他),那么我应该注意,如果程序包含导致未定义行为的构造,然后,即使在到达展示未定义行为的构造之前,整个程序的行为也是未定义的.因此,即使a数组总是正确索引,但其他一些不相关的数组也没有,那么你仍有可能陷入垃圾a.永远不要期望具有未定义行为的程序中的任何一致性.