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

时间:2012-02-02 13:01:37

标签: c++ data-structures

我有一些代码,其中有两个bool数组a[]b[],大小相同N

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

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

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

我在程序中if部分之前添加了另一个测试条件

if(a[index]==-1){
cout<<"its True";
}

但是“它的真实”从未打印过。

为什么会发生这种情况?

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

的查询

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的LSB存储在数组ab

的MSB中

代码:

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;
}

3 个答案:

答案 0 :(得分:5)

如果a确实是bool数组,那么除非您越界a[i]==-1,否则总是会产生false。毫无疑问。另一方面,如果你 超出界限,那么行为 undefined 意味着一切都可以发生,包括评估为-1的布尔值。

此外,a可能是BOOL数组而不是boolBOOL可以是typedef'或#define d int

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

答案 1 :(得分:0)

我猜有时index或'* it'中的一个实际上不在范围内。如何存储bool是依赖于实现的,但是你在数组的末尾运行,那么它很可能返回0或1以外的值。

顺便说一句,如果a是bool数组,将[* it]与1进行比较并不是一件好事。它应该只是测试一下:

   if (a[*it] && something)

答案 2 :(得分:0)

你强制从布尔到整数的转换,在这种情况下是不必要的。我只想使用逻辑运算符来实现相同的代码。

无论如何,回答你的问题,这可能是真的。

int main(){
    bool a = -1;
    printf("a = %d\n", a);
    return 0;
}

打印出“a = 1”。