标志 |= f == s[i],这个语句会做什么?

  • 本文关键字:语句 标志 c++
  • 更新时间 :
  • 英文 :


flag |= f == s[i],这个语句将做什么,其中flag==0f是一个strings是字符串数组。

int main()
{
int n; 
cin >> n; 
vector<string> s(n); 
vector<int> t(n); 
for (int i = 0; i < n; i++) 
{ 
cin >> s[i] >> t[i];
}
string f; 
cin >> f; 
int ans = 0; 
int flag = 0; 
for (int i = 0; i < n; i++) 
{ 
ans += flag * t[i]; 
flag |= f == s[i]; 
} 
cout << ans << 'n'; 
return 0; 
}

flag |= f == s[i]可以写flag = flag | f == s[i]flag值和f == s[i]的结果(0 或 1(之间的按位 OR

如果随时f == s[i],这会将flag设置为 1

flag | f == s[i] | result
-----+-----------+-------
0   | 0         | 0
0   | 1         | 1
1   | 0         | 1
1   | 1         | 1

在这种情况下,这是

if (f == s[i])
{
flag = 1;
}

首先,复合赋值(如|=(等于

例如
flag = flag | f == s[i]

然后使用==进行比较会得到一个bool值(truefalse(。

类型bool可以隐式转换为intfalse0true1

所以这要么是

flag = flag | 0;  // f == s[i] is false

flag = flag | 1;  // f == s[i] is true

最后是|运算符,它是按位 or。按位或带1将设置最低位。如果flag0那么它要么保持0(如果f == s[i]为假(,要么变为1(如果f == s[i]为真(。设置为1的值flag将不会再次更改所示代码中的值。

标志在开头为 0 "中和">

ans += flag * t[i]; //ans += 0* t[i] <==> ans = ans + 0 <==> {;}

一旦标志在flag |= f == s[i];时变为真(当f == s[i]时(,它就保持为真(因为true|false==truetrue|true==true,并且操作变为

ans += 1 * t[i]; // <==> ans += t[i];

与其ans += flag * t[i];,不如if (flag) ans += t[i];

或者,您可以使用函数(或 goto(代替标志:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
int sum_since(std::vector<int> const &X, size_t N)
{
size_t top = X.size();
int r=0; for(size_t i=N; i<top; i++) r+=X[i];
return r;
}
int main() { 
int n; 
cin >> n; 
vector<string> s(n); 
vector<int> t(n); 
for (int i = 0; i < n; i++) { 
cin >> s[i] >> t[i]; 
} 
string f; 
cin >> f; 
int ans = 0; 
int flag = 0; 
for (int i = 0; i < n; i++)
if( f==s[i] ) { ans=sum_since(t,i); break; }
cout << ans << 'n'; 
return 0; 
}

最新更新