我有一些代码,其中有两个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;
}
对我来说,if条件|| (a[index]==b[index] && a[index]==-1 && index!=0)
的第二部分永远不会成立,因为a[index]
对于任何-1
都不等于index
,它会可以是1
或0
。 ..所以我认为我可以删除那部分,但结果会发生变化,对于某些特定条件(我不知道条件,它是一个在线判断类型网站,我不知道他们的测试用例是什么)。
我在程序中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存储在数组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;
}
答案 0 :(得分:5)
如果a
确实是bool
数组,那么除非您越界a[i]==-1
,否则总是会产生false
。毫无疑问。另一方面,如果你 做 超出界限,那么行为 undefined 意味着一切都可以发生,包括评估为-1
的布尔值。
此外,a
可能是BOOL
数组而不是bool
。 BOOL
可以是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”。