看看这个小小的片段。
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;
最后我得到了一个正确的答案。但是如果没有这些过程,使用|
运算符可以完成所有操作。为什么呢?
&lt;其他信息&gt;
我的编译器版本如下。
$ 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。纠正我的英语不好总是受到欢迎)
答案 0 :(得分:4)
代码不做同样的事情,因为条件不是彼此的否定。试试y == 3, v == 2
:
y < v | !v
=&gt; 3 < 2 | !2
=&gt; false | !true
=&gt; false | false
=&gt; 0 | 0
=&gt; 0
y > v & v
=&gt; 3 > 2 & 2
=&gt; true & 2
=&gt; 1 & 2
=&gt; 0
答案 1 :(得分:2)
在此片段中:
y<v|!v?:y=v;
v
的值转换为bool
,并以!
取消。因为按位或|
的两边都是bool,|
的行为类似于逻辑或。{/ p>
在另一种情况下:
y>v&v?y=v:0;
没有转化为bool
,而y>v
的结果转换为int
。按位和&
给出不同的结果,具体取决于v
的最低位。它的行为不像逻辑和。
这应该像原作一样:
y>v&!!v?y=v:0;
因为转换为bool。
答案 2 :(得分:2)
条件运算符的语法是:
逻辑表达式? true-expression:false-expression
在第一个中,
y<v|!v ? : y=v;
您缺少 true-expression 。当使用-Wall
编译时,我用g ++获得以下编译器警告。
socc.cc: In function ‘int main()’:
socc.cc:14:12: warning: the omitted middle operand in ?: will always be ‘true’, suggest explicit middle operand [-Wparentheses]
y<v||!v?:y=v;
在第二个中,
y>v&v ? y=v : ;
您缺少 false-expression 。出于某种原因,g ++将此视为错误而非警告。
你可以通过为它们提供虚拟值来解决这个问题。
顺便说一句,您使用的是按位运算符|
和&
。我确信这是一个小错误。
您可以使用:
(y<v || !v) ? 0 : y=v;
或
(y>v && v) ? y=v : 0;
<强>更新强>
表达式
(y<v || !v) ? : y=v;
不是合法的C / C ++。它受g ++支持作为扩展。在C conditional operator ('?') with empty second parameter可以看到更多内容。