按位和/或使用三元运算符

Bitwise and/or with ternary operator

本文关键字:三元 运算符      更新时间:2023-10-16

看看这个小片段。

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条件运算符('?'),第二个参数为空。