2009-10-01 30 views
11

Ich habe dieses C++ - Makro und frage mich, was sie mit Code% 2 (das Prozentzeichen) meinen?C++ Was bedeutet das Prozentzeichen?

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

Antwort

24

Es ist für die Aufnahme eines Moduls.

Grundsätzlich ist es eine ganzzahlige Darstellung des Rests.

Also, wenn Sie durch 2 teilen, haben Sie entweder 0 oder 1 als Rest.

Dies ist eine gute Möglichkeit, Zahlen zu durchlaufen. Wenn Sie möchten, dass die geraden Zeilen eine Farbe und die ungeraden Zeilen eine andere Farbe haben, funktioniert Modul 2 für eine beliebige Anzahl von Zeilen.

9

Es bedeutet der Rest einer Abteilung. In Ihrem Fall dividiere durch 2 und der Rest ist entweder 0 oder 1.

+0

der Rest kann sei negativ. Der C++ - Standard erfordert nur die Gleichheit (a/b) * b + (a% b) = a im Fall b! = 0 und ermöglicht die Integer-Division auf Null zu runden (C++ 0x erfordert es sogar) – sellibitze

+1

Obwohl der Rest nur kann sei negativ, wenn die Dividende negativ ist (oder der Divisor, aber das ist hier 2). Je nachdem, was "Code" ist, ist das vielleicht kein Problem, und hoffentlich hat der Programmierer daran gedacht, wenn er dokumentiert, wie das Makro SHUFFLE_STATEMENT_2 verwendet werden soll. –

6

Es bedeutet modulo. Normalerweise unterscheidet (x % 2) ungerade und gerade Zahlen.

4

Das ist der Modulo. Es gibt zurück, was nach der Teilung übrig ist:

10/3 wird geben 3. - 1 ist übrig.

10% 3 ergibt diese 1.

2

modulo den Rest zurück, der nach der Teilung verbleibt. Es ist hilfreich, wenn Sie mit der Bestimmung gerade/ungerade/Primzahlen als Beispiel beauftragt sind:

Hier ist ein Beispiel für die Verwendung es Primzahlen zu finden:

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

Falls jemand kommt zu kümmern:% wirklich den Rest zurück, nicht den Modul. Solange die Zahlen positiv sind, gibt es keinen Unterschied.

Bei negativen Zahlen kann es jedoch einen Unterschied geben. Zum Beispiel kann -3/2 zwei mögliche Antworten geben: -1 mit einem Rest von -1 oder -2 mit einem Rest von 1. Zumindest wie es normalerweise in der modularen Arithmetik verwendet wird, ist der Modul immer positiv, also der erste Ergebnis entspricht nicht einem Modul.

C89/90 und C++ 98/03 erlauben jedoch beide Antworten, solange/und% Antworten ergeben, die zusammenarbeiten, damit Sie die Eingabe reproduzieren können (zB -1x2 + -1 -> - 3, -2x2 + 1 = -3).

Für neuere Versionen der Standards (C99, C11 und C++ 11) gibt es keine Wahl mehr: Integer-Division muss rund in Richtung 0. Zum Beispiel -3/2 muss geben -1 mit einem Rest von - 1. -3/2 gibt -2 mit einem Rest von 1 ist nicht mehr erlaubt.

+0

+1. Meiner Meinung nach ist dies die einzig befriedigende Antwort. Der Standard erwähnt die Gleichheit (a/b) * b + (a% b) = a. Außerdem fügt C++ 0x die Garantie hinzu, dass Ganzzahldivision immer auf Null gerundet wird. Das macht -3/2 = 1 und -3% 2 = -1. – sellibitze

+1

+1. Und mehrmals wollte ich den Modul einer negativen Zahl nehmen, aber es ist ein sofort garantierter Fehler. Es ist ein echter Fehler in C/C++: garantiert ohne Probleme zu kompilieren und könnte auf einer Plattform funktionieren, aber sofort (und mysteriös) stürzt ab, wenn es anderswo kompiliert wird. – Potatoswatter

0

Es ist der Rest der Division. So wie wie 5 geteilt durch 2 hat einen Rest von 1, da 2 in 5 2 mal geht, aber das entspricht nur vier, und Sie haben das gewisse Extra am Ende

5% 2 == 1

Hinweis dass Teilungswert ist überall nicht berechnet werden, wenn Sie also sowohl die ganze Gesamt ganzzahligen Wert der Division wollte, und es ist Rest

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

„5 geteilt durch 2 ist 2 mit Rest 1“