Schauen Sie sich diesen kleinen Ausschnitt an.Bitweise und/oder mit ternärem Operator
y<v|!v?:y=v;
(y
ist Minimalwert und v
ist Strom verglichen Wert. So kann man leichter denken würde.)
Diese Bedeutung des Schnipsel einfach ist.
Wenn der aktuelle Wert v
kleiner ist als der Minimalwert y
, setzen Sie den neuen Mindestwert (y=v
). Aber v=0
Fall ist ausgeschlossen.
Dann dachte ich, wenn der "nachteilige Code" generiert werden könnte, sollte das Ergebnis gleich sein. Ich meine,
y>v&v?y=v:;
Dieser Code sollte die gleiche Sache tun. Aber es kann nicht kompiliert werden. Der Fehler ist wie folgt.
error: expected expression
for(int v: a) v=abs(a[i]-v), x>v?:x=v, y>v&v?y=v:;
^
Es ist seltsam. Ich denke, dass zwei Codes einander gleich sind. Wenn der zweite ternäre Operator fehlerhaft ist, sollte der vorherige den gleichen Fehler haben. Aber es tat es nicht.
Kann jemand erklären warum?
Nächste Frage. Ich habe eine 0
zum kompilieren eingefügt. y>v&v?y=v:0;
Dann bekam ich eine falsche Antwort. So änderte ich &
zu &&
. y>v&&v?y=v:0;
Endlich bekam ich eine richtige Antwort. Aber ohne diesen Prozess kann der Operator |
alles tun. Warum?
< weitere Informationen>
Mein Compiler-Version ist wie folgt.
$ 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
Und kompilieren Option:
g++ -std=c++11 my.cpp
Wenn Sie einen Beispielcode haben wollen zu testen, dies helfen würde.
#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. Korrektur meiner armen Englisch ist immer willkommen)
@YuHao Diese sind alle nur zum Spaß. Ich weiß, Lesbarkeit ist sehr, sehr wichtig. :) – plhn
[C++ Operator-Vorrang] (http://en.cppreference.com/w/cpp/language/operator_precedence) – CoryKramer
': Nichts macht keinen Sinn. Sie benötigen einen Wert für den ternären Operator. –