2009-10-01 33 views
11

Mam to C++ makro i zastanawiam się, co oznaczają przez kod% 2 (znak procentowy)?C++ Co oznacza znak procentowy?

#define SHUFFLE_STATEMENT_2(code, A, B) 
switch (code%2) 
{ 
    case 0 : A; B; break; 
    case 1 : B; A; break; 
} 

Odpowiedz

24

Jest za pobranie modułu.

Zasadniczo jest to liczba całkowita reprezentująca pozostałą część.

Tak więc, jeśli podzielisz przez 2, będziesz mieć 0 lub 1 jako pozostałą część.

To dobry sposób na przechodzenie między numerami, a jeśli chcesz, aby parzyste wiersze miały jeden kolor, a nieparzyste wiersze były inne, moduł 2 działa dobrze dla dowolnej liczby wierszy.

9

Oznacza to pozostałą część podziału. W twoim przypadku podziel przez 2, a reszta będzie wynosić 0 lub 1.

+0

pozostała puszka być negatywne. Standard C++ wymaga tylko równości (a/b) * b + (a% b) = a w przypadku b! = 0 i pozwala na całkowite dzielenie się zaokrągleniem do zera (C++ 0x wymaga tego nawet) – sellibitze

+1

Mimo że pozostała część może tylko ujemne, jeśli dywidenda jest ujemna (lub dzielnik, ale tutaj 2). Tak więc w zależności od tego, jaki "kod" jest, może to nie być problem, i mam nadzieję, że programista pomyślał o tym podczas dokumentowania sposobu użycia makra SHUFFLE_STATEMENT_2. –

6

To znaczy modulo. Zwykle (x % 2) rozróżnia liczby nieparzyste i parzyste.

4

To jest modulo. Zwraca to, co pozostało po podziale:

10/3 da 3. - 1 zostaje.

10% 3 przedstawia ten 1.

2

modulo zwraca resztę, która pozostała po dzieleniu. Jest to przydatne, gdy jesteś upoważniony do określenia parzyste/nieparzyste numery/prime jako przykład:

Oto przykład użycia go znaleźć liczb pierwszych:

int main(void) 

{ int isPrime = 1; int n;

cout << "Enter n: "; 
cin >> n; 

for (int i=1; i<=n; i++) 
{ 
    for (int j=2; j <= sqrt(static_cast<double>(i)); j++) 
    { 
     if(!(i%j)) 
     { 
      isPrime=0; 
      break; 
     } 

    } 

    if (isPrime) 
     cout << i << " is prime" << endl; 
    isPrime=1; 
} 
return 0; 

}

17

W przypadku kogoś dzieje obchodzi:% naprawdę zwraca resztę, nie moduł. Dopóki liczby są dodatnie, nie ma różnicy.

Dla liczb ujemnych może być jednak różnica. Na przykład, -3/2 może dać dwie możliwe odpowiedzi: -1 z resztą -1 lub -2 z resztą 1. Przynajmniej tak, jak jest zwykle używane w modułowej arytmetyki, moduł jest zawsze dodatni, więc pierwsze wynik nie odpowiada modułowi.

C89/90 i C++ 98/03 pozwalają na odpowiedź, tak długo jak/i% tworzą odpowiedzi, które działają razem, więc możesz odtworzyć dane wejściowe (np. -1x2 + -1 -> - 3, -2x2 + 1 = -3).

Dla nowszych wersji standardów (C99, C11 i C++ 11) nie ma już żadnego wyboru: podział całkowity musi zaokrąglić w kierunku 0. Na przykład -3/2 musi dać -1 z resztą - 1. -3/2 Podanie -2 z resztą 1 nie jest już dozwolone.

+0

+1. Moim zdaniem jest to jedyna satysfakcjonująca odpowiedź. Standard wspomina o równości (a/b) * b + (a% b) = a. Również C++ 0x doda gwarancję, że podział liczb całkowitych zawsze zaokrągli się w kierunku zera. To sprawia, że ​​-3/2 = 1 i -3% 2 = -1. – sellibitze

+1

+1. I kilka razy chciałem wziąć moduł ujemnej liczby, ale jest to natychmiast gwarantowany błąd. Jest to prawdziwa wada w C/C++: gwarantowana kompilacja bez żadnych problemów i może działać na jednej platformie, ale natychmiastowa (i tajemnicza) awaria, gdy jest skompilowana gdzie indziej. – Potatoswatter

0

To pozostała część podziału. Tak jak jak 5 podzielonej przez 2 ma pozostałą część 1, ponieważ 2 przechodzi w 5 2 razy, ale to tylko równa się cztery, i że masz trochę więcej na koniec

5% 2 == 1

Note że wartość podział nie jest obliczany w dowolnym miejscu, więc jeśli chciałeś zarówno cała łączna wartość całkowitą z dzielenia a to reszta

int answer = 5/2; 
int remainder = 5 % 2; 
cout << "5 divided by 2 is " << answer << " with remainder " << remainder; 

„5 podzielone przez 2 wynosi 2 z pozostałą 1”