Guarda questo piccolo frammento.Bitwise e/o con operatore ternario
y<v|!v?:y=v;
(y
è il valore minimo e v
è valore rispetto corrente. In questo modo ti fa pensare più facile.)
significato di questo frammento di codice è semplice.
Se il valore corrente v
è inferiore al valore minimo , impostare un nuovo valore minimo (y=v
). Ma il caso v=0
è escluso.
Poi ho pensato che se il "codice negativo" potesse essere generato, il risultato dovrebbe essere lo stesso. Voglio dire,
y>v&v?y=v:;
Questo codice dovrebbe fare la stessa cosa. Ma non può essere compilato. L'errore è il seguente.
error: expected expression
for(int v: a) v=abs(a[i]-v), x>v?:x=v, y>v&v?y=v:;
^
È strano. Penso che due codici siano uguali tra loro. Se l'ultimo operatore ternario è errato, l'ex dovrebbe avere lo stesso problema. Ma non è stato così.
Qualcuno può spiegare perché?
Domanda successiva. Ho inserito un 0
da compilare. y>v&v?y=v:0;
Poi ho ricevuto una risposta falsa. Così ho cambiato &
a &&
. y>v&&v?y=v:0;
Finalmente ho avuto una risposta giusta. Ma senza questi processi, l'operatore |
può fare tutto. Perché?
< informazioni aggiuntive>
La mia versione del compilatore è la seguente.
$ 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
e compilare opzione:
g++ -std=c++11 my.cpp
Se si desidera avere un codice di esempio per testare, questo aiuterebbe.
#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;
}
(correzione P.S. del mio povero inglese è sempre benvenuta)
@YuHao Questi sono solo per divertimento. So che la leggibilità è molto importante. :) – plhn
[Precisione dell'operatore C++] (http://en.cppreference.com/w/cpp/language/operator_precedence) – CoryKramer
': niente 'non ha senso. hai bisogno di un valore per l'operatore ternario. –