按位和/或使用三元运算符
Bitwise and/or with ternary operator
看看这个小片段。
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;更多信息>
我的编译器版本如下:
$ 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;
}
(注。我的英语很差,欢迎指正)
代码不做同样的事情,因为条件不是彼此的否定。试试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
,并与!
取反。因为按位或|
的两边都是bool,所以|
的行为类似于逻辑或。
另一种情况:
y>v&v?y=v:0;
没有到bool
的转换,而是将y>v
的结果转换为int
。按位和&
给出不同的结果,这取决于v
的最低位。它不像逻辑上的and。
这应该和原来的一样:
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条件运算符('?'),第二个参数为空。
- 三元运算符和 if constexpr
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 三元运算符在返回语句中给出意外的结果
- 递归中三元运算符的奇怪行为
- 错误:三元运算符无法在对象中正常工作"cout"
- 是否允许三元运算符在C++中计算两个操作数?
- 有条件地选择带有 decltype() 和三元运算符的类型
- 三元运算符在C++中的意外行为
- 有没有办法将 for 循环结果返回到像三元运算符这样的函数中?
- 变量值,在三元运算符之后
- 是否可以在C++中使用三元运算符在 if 语句中选择比较运算符?
- c++中的增量和三元运算符优先级
- C++中三元运算符的意外行为
- 用于返回开关的三元运算符
- 替换模板元编程中的三元运算符
- 三元运算符 '?:' 在 4.9.0 之前的 GCC 版本中推断出不正确的类型?
- 在 std::map 上使用三元运算符和 std::更大的附加参数
- "Do nothing"在三元运算符的其他部分?
- 如何确定三元运算符的返回类型?
- 无法使用三元运算符有条件地分配"istream &"?