2012-07-02 23 views
5

Więc wiem, że C++ ma Priorytet operatorów i żeC/C++ Math Porządek działania

int x = ++i + i++; 

jest nieokreślona, ​​ponieważ pre ++ i pisać ++ są na tym samym poziomie, a zatem nie ma sposobu, aby powiedzieć, które z nich będzie najpierw się wyliczy. Ale zastanawiałem się, czy nie jest niezdefiniowana. Powodem, dla którego pytam, jest to, że istnieje wiele sposobów, aby na to spojrzeć (1/2)/3 LUB 1/(2/3). Zgaduję, że jest to niezdefiniowane zachowanie, ale chciałbym to potwierdzić.

+3

Nie, nie jest niezdefiniowany. Jest (jeden podzielony przez dwa) podzielone przez trzy. Innymi słowy, to zwykła wyrażenie matematyczne. –

+0

Myślę, że twoje myślenie jest tutaj trochę mgliste, a to przenika twoje myślenie o drugim. Pierwszy naprawdę sprowadza się do porządku oceny argumentów dla niezdefiniowanej funkcji. Oznacza to, że jeśli myślisz o tym jako 'operator + (++ i, i ++)', to przeskakuje na ciebie. –

+1

C++ (i większość innych języków programowania) mają zdefiniowaną kolejność pierwszeństwa zapożyczoną z matematyki. Nie patrzysz na wyrażenie na wiele sposobów; operacje matematyczne mają hierarchię. Można jednak zmienić kolejność operacji za pomocą (dobrze umieszczonego) nawiasu. –

Odpowiedz

5

W przykładzie kompilator ma swobodę oceny "1" „2 "i" 3 "w dowolnej kolejności, a następnie zastosować podział od lewej do prawej.

To samo dotyczy przykładu i ++ + i ++. Może oceniać i ++ w dowolnej kolejności i właśnie tam leży problem.

Nie jest tak, że pierwszeństwo funkcji nie jest zdefiniowane, jest to kolejność oceny jej argumentów.

17

Jeśli spojrzeć na C++ operator precedence and associativity, zobaczysz, że operator podział lewej do prawej asocjacyjne, co oznacza, że ​​zostanie to ocenione jako (1/2)/3, ponieważ:

operatorów, które znajdują się w ta sama komórka (może być kilka wierszy operatorów wymienionych w komórce) jest ocenianych z tym samym priorytetem w danym kierunku. Na przykład wyrażenie a = b = c jest analizowane jako a = (b = c), a nie jako (a = b) = c z powodu asocjacji od prawej do lewej.

5

Pierwszy fragment kodu jest niezdefiniowanym zachowaniem, ponieważ zmienna i jest modyfikowana wiele razy pomiędzy punktami sekwencji.

Kod drugi fragment jest określone zachowanie i odpowiada:

int i = (1/2)/3; 

jako operator / jest od lewej do prawej asocjatywnego.

+0

Czy możesz wyjaśnić, dlaczego pierwszy fragment kodu jest niezdefiniowanym zachowaniem? Daje wynik 10, jeśli użyjesz 'i = 4'. Przepraszam, jestem nowicjuszem. – akaHuman

+0

@ shrey347, patrz http://c-faq.com/expr/seqpoints.html – hmjd

2

Jest ona zdefiniowana, to idzie od lewej do prawej:

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) { 
    int i = 16/2/2/2; 
    cout<<i<<endl; 
    return 0; 
} 

print "2" zamiast 1 lub 16.

0

Może to oznaczać, że jest niezdefiniowana, ponieważ wybrałeś int, który jest zbiorem liczb całkowitych. Wypróbuj podwójne lub zmiennoprzecinkowe, które zawierają ułamki.