Myślałem o kilku błędach dla początkujących i skończyłem na jednym z if
oświadczenia. Rozszerzyłem nieco kod do tego:
int i = 0;
if (i = 1 && i == 0) {
std::cout << i;
}
Widziałem, że if
stwierdzenie zwraca wartość true i cout
brzmi i
jak 1
. Jeśli i
jest przypisane 1
w instrukcji if, dlaczego i == 0
powrócił true
?
c++
if-statement
TehMattGR
źródło
źródło
i
jest ustawiona na1
.1 && i == 0
?Odpowiedzi:
Ma to związek z pierwszeństwem operatora .
nie jest
ponieważ zarówno
&&
i==
mają wyższy priorytet niż=
. Tak naprawdę to działaktóry przypisuje wynik
1 && (i == 0)
doi
. Tak więc, jeślii
zaczyna się od,0
toi == 0
jesttrue
, więc1 && true
jesttrue
(lub1
), a następniei
zostaje ustawione na1
. Następnie, ponieważ1
jest to prawda, wpisujesz blok if i wypisujesz przypisaną wartośći
.źródło
i = !i; if (i)
poprawnie napisaneZakładając, że Twój kod wygląda tak:
Wtedy to:
ocenia jako
i tak
i
jest ustawiony na1
.źródło
using namespace std
!=
przyszedł wcześniej,&&
mógł zobaczyć problem. Ponadto tak, rozszerzenie jest obce, ale nie sądzę, żeby miało to tak duże znaczenie. Nie mogę uwierzyć, że tak niewielkie różnice powodują, że ludzie głosują od 151 do -4.Ma to związek z analizowaniem reguł od prawej do lewej. Np. Y = x + 5.
Wszystkie podwyrażenia są ważone według ważności. Dwa wyrażenia o tym samym znaczeniu są oceniane od prawej do lewej,. Strona wyrażania && jest wykonywana jako pierwsza, a następnie LHS.
Dla mnie to ma sens.
źródło
Rzeczywista odpowiedź to:
Jako dowód spójrz na dane wyjściowe asm twojego kompilatora dla wprowadzonego kodu (wszystkie komentarze są moje):
Powyższy wynik asm pochodzi z CLANG, ale wszystkie inne kompilatory, na które patrzyłem, dawały podobne wyniki. Dotyczy to wszystkich kompilatorów w tej witrynie, bez względu na to, czy są to kompilatory czystego C, czy C ++, a wszystko to bez pragnienia zmiany trybu kompilatora (domyślnie C ++ dla kompilatorów C ++).
Zauważ, że twój kompilator tak naprawdę nie ustawił i = 1, ale i = TRUE (co oznacza dowolną 32-bitową niezerową wartość całkowitą). Jest tak, ponieważ operator && ocenia tylko, czy instrukcja ma wartość PRAWDA, czy FAŁSZ, a następnie ustawia wyniki zgodnie z tym wynikiem. Jako dowód spróbuj zmienić i = 1 na i = 2 i sam możesz zaobserwować, że nic się nie zmieni. Przekonaj się, korzystając z dowolnego kompilatora online w Eksploratorze kompilatorów
źródło
i = 1
jest operatorem przypisania [nie równoważności]; 2b) Zapewniam cię, żeif (i = 0)
w C i C ++ wystąpią fałszywe warunki, więc to, czy będzie to prawda, że „nigdy nie zawodzi” jest nieco mylące.and cl, 1 ; = operator always TRUE
<< popraw mnie, jeśli się mylę, ale nie widzę tutaj żadnego przypisania. Reprezentuje1 &&
część wyrażenia. Ta odpowiedź w zasadzie dotyczyfalse
.if ( i = 0 ) { print something }
. Również twoja odpowiedź jest sprzeczna; na początku mówisz, żei=1
jest oceniany przed&&
zastosowaniem, a na końcu mówisz, żei
jest ustawiony na wynik&&
operatora.