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)
如果a确实是一个bool数组,那么除非你越界a[i]==-1将永远屈服false.毫无疑问.在另一方面,如果你去出界,则行为是不确定的意思,一切都可能发生,包括一个布尔值计算到-1.
此外,有可能a是一个BOOL数组而不是bool.BOOL可能是typedef'或#defined int.
更新:由于OP维护数组是类型的bool并且绝对没有溢出的可能性(让我假装一段时间我相信他),那么我应该注意,如果程序包含导致未定义行为的构造,然后,即使在到达展示未定义行为的构造之前,整个程序的行为也是未定义的.因此,即使a数组总是正确索引,但其他一些不相关的数组也没有,那么你仍有可能陷入垃圾a.永远不要期望具有未定义行为的程序中的任何一致性.