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;
}
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;
}
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.
Oznacza to pozostałą część podziału. W twoim przypadku podziel przez 2, a reszta będzie wynosić 0 lub 1.
To znaczy modulo. Zwykle (x % 2)
rozróżnia liczby nieparzyste i parzyste.
To jest modulo. Zwraca to, co pozostało po podziale:
10/3 da 3. - 1 zostaje.
10% 3 przedstawia ten 1.
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;
}
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.
+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. 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
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”
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
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. –