我不明白这个带有按位
|
运算符的代码行。
ok|=(s[i]=='0' && s[i+1]=='1');
结果如何?
#include<iostream>
using namespace std;
void solve(){
string s; //`string`
cin>>s //`string input`
int res=1;
bool ok=false;
for(int i=0;i+1<(int) (s.size());i++){
res+=(s[i]!=s[i+1]);
ok|=(s[i]=='0' && s[i+1]=='1');//`this line i dont understand`
}
cout<<res<<'\n';
}
切割二元运算。
(s[i]=='0' && s[i+1]=='1')
是一个布尔表达式,如果true
是s[i]
并且'0'
是s[i+1]
,结果将是'1'
,否则结果将是false
。因此,ok
将在每次循环迭代时使用 ok|=true
或 ok|=false
进行更新。
但是,
|=
没有定义bool
运算符,因此编译器会将ok
和true
|false
结果先转换为int
,然后使用int
执行按位运算s,然后将结果赋回给 ok
。
实际上,该声明:
ok|=(s[i]=='0' && s[i+1]=='1');
相当于这个:
ok = bool(int(ok) | int(s[i]=='0' && s[i+1]=='1'));
ok
被初始化为false
(0),然后如果true
在任何地方包含子串s
,则其低位切换为1("01"
),否则ok
将保留为false
。