看这个小片段。
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;
最终我得到了正确的答案。但是没有这些过程,使用|
运算符就可以完成所有操作。为什么?
<additional info>
我的编译器版本如下。
$ 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;
}
(P.S. 欢迎纠正我的英语错误)
我们可以使用版本控制工具来管理IT项目的源代码。最流行的版本控制系统是Git,它是一个免费开源的工具,可以跟踪代码修改并记录每次更改的细节。GitHub是一个基于Git的Web平台,用户可以在上面托管他们的代码,并与其他人协作。团队成员可以通过克隆仓库、拉取更新和提交变更等方式进行代码共享和合作。Git和GitHub是IT开发过程中必备的工具,对于单个开发者和团队都非常重要。
-std=c++11 -Wall -Wextra -pedantic
编译,你会得到warning: ISO C++ does not allow ?: with omitted middle operand [-Wpedantic]
和一些其他有关运算符优先级的有用警告。同样地,使用 Clang 编译,会得到更多有用的警告。 - bogdan