按位和/或使用三元运算符

plh*_*lhn 5 c++ ternary-operator bitwise-operators logical-operators logical-or

看看这个小片段.

y<v|!v?:y=v;
Run Code Online (Sandbox Code Playgroud)

(y是最小值,v是当前比较值.这种方式会让你更容易思考.)

这个片段的含义很简单.
如果当前值v小于最小值y,则设置新的最小值(y=v).但v=0案件被排除在外.

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

y>v&v?y=v:;
Run Code Online (Sandbox Code Playgroud)

这段代码应该做同样的事情.但它无法编译.错误如下.

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

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

有人可以解释原因吗?

下一个问题.我插入一个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
Run Code Online (Sandbox Code Playgroud)

并编译选项:

g++ -std=c++11 my.cpp
Run Code Online (Sandbox Code Playgroud)

如果您想要测试示例代码,这将有所帮助.

#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;
}
Run Code Online (Sandbox Code Playgroud)

(ps校正我的英语不好总是受到欢迎)

ala*_*ain 2

在这个片段中:

y<v|!v?:y=v;
Run Code Online (Sandbox Code Playgroud)

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

在另一种情况下:

y>v&v?y=v:0;
Run Code Online (Sandbox Code Playgroud)

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

y>v&!!v?y=v:0;
Run Code Online (Sandbox Code Playgroud)

因为有一个到 bool 的转换。