看看这个小片段。
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 更正)