按位和/或三元运算符

hn

看看这个小片段。

y<v|!v?:y=v;

y是最小值,v是当前比较值。这种方式可以使您考虑起来更容易。)

此代码段的意思很简单。
如果当前值v小于最小值y,则设置新的最小值(y=v)。v=0案件不包括在内。

然后我想如果可以生成“不良代码”,结果应该是相同的。我的意思是,

y>v&v?y=v:;

这段代码应该做同样的事情。但是它不能被编译。错误如下。

error: expected expression
  for(int v: a) v=abs(a[i]-v), x>v?:x=v, y>v&v?y=v:;
                                                   ^

有点奇怪。我认为两个代码彼此相同。如果后面的三元运算符是错误的,那么前者应该有同样的问题。但事实并非如此。

有人可以解释为什么吗?

下一个问题。我插入一个0进行编译。y>v&v?y=v:0;
然后我得到一个错误的答案。所以我改变了&&&y>v&&v?y=v:0;
最后我得到了正确的答案。但是没有这些过程,使用|运算符就可以完成所有工作。为什么?

<其他信息>

我的编译器版本如下。

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix

并编译选项:

g++ -std=c++11 my.cpp

如果您想要一个示例代码进行测试,这将有所帮助。

#include <iostream>
#include <vector>
using namespace std;
int working(int i, vector<int> a) {
  int y=INT_MAX;
  for(int v: a) v=abs(a[i]-v), y<v|!v?:y=v;
  return y;
}

int not_working(int i, vector<int> a) {
  int y=INT_MAX;
  for(int v: a) v=abs(a[i]-v), y>v&v?y=v:0;
  return y;
}

int main() {
  vector<int> b({-5,-2,2,7});
  cout << working(2, b) << endl;
  cout << not_working(2,b) << endl;
  return 0;
}

(总是欢迎对我英语不好的人进行ps纠正)

阿兰

在此片段中:

y<v|!v?:y=v;

的值v转换为abool并用取反!因为按位或的两边|都是布尔,所以|行为类似于逻辑或。

在另一种情况下:

y>v&v?y=v:0;

没有转换为bool,而是将的结果y>v转换为int按和&给出不同的结果,具体取决于的最低位v它的行为不像逻辑和。
这应该像原始的一样工作:

y>v&!!v?y=v:0;

因为有转换为bool。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章