按位 and/or 与三元运算符
Bitwise and/or with ternary operator
看看这个小片段。
y<v|!v?:y=v;
(y
为最小值,v
为当前比较值,这样想起来更容易。)
这段代码的意思很简单。
如果当前值v
小于最小值y
,设置新的最小值(y=v
)。但排除v=0
个案。
然后我想如果可以生成'adverse code',结果应该是一样的。我是说,
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;
}
(p.s。欢迎指正我糟糕的英文)
代码不做同样的事情,因为条件不是彼此的否定。试试 y == 3, v == 2
:
y < v | !v
=> 3 < 2 | !2
=> false | !true
=> false | false
=> 0 | 0
=> 0
y > v & v
=> 3 > 2 & 2
=> true & 2
=> 1 & 2
=> 0
在此代码段中:
y<v|!v?:y=v;
v
的值被转换为 bool
并用 !
取反。因为按位或 |
的两边都是布尔值,所以 |
的行为类似于逻辑或。
另一种情况:
y>v&v?y=v:0;
没有转换为 bool
,而是 y>v
的结果转换为 int
。按位和 &
给出不同的结果,具体取决于 v
的最低位。它的行为不像逻辑与。
这应该像原来的那样工作:
y>v&!!v?y=v:0;
因为有一个布尔值的转换。
条件运算符的语法为:
逻辑表达式 ?真表达式:假表达式
第一个,
y<v|!v ? : y=v;
您缺少 真实表达式。使用 -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.
查看更多内容
看看这个小片段。
y<v|!v?:y=v;
(y
为最小值,v
为当前比较值,这样想起来更容易。)
这段代码的意思很简单。
如果当前值v
小于最小值y
,设置新的最小值(y=v
)。但排除v=0
个案。
然后我想如果可以生成'adverse code',结果应该是一样的。我是说,
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;
}
(p.s。欢迎指正我糟糕的英文)
代码不做同样的事情,因为条件不是彼此的否定。试试 y == 3, v == 2
:
y < v | !v
=> 3 < 2 | !2
=> false | !true
=> false | false
=> 0 | 0
=> 0
y > v & v
=> 3 > 2 & 2
=> true & 2
=> 1 & 2
=> 0
在此代码段中:
y<v|!v?:y=v;
v
的值被转换为 bool
并用 !
取反。因为按位或 |
的两边都是布尔值,所以 |
的行为类似于逻辑或。
另一种情况:
y>v&v?y=v:0;
没有转换为 bool
,而是 y>v
的结果转换为 int
。按位和 &
给出不同的结果,具体取决于 v
的最低位。它的行为不像逻辑与。
这应该像原来的那样工作:
y>v&!!v?y=v:0;
因为有一个布尔值的转换。
条件运算符的语法为:
逻辑表达式 ?真表达式:假表达式
第一个,
y<v|!v ? : y=v;
您缺少 真实表达式。使用 -Wall
.
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.
查看更多内容