Unterschied zwischen & und && in C?

Lesezeit: 5 Minuten

Benutzer-Avatar von sadsa dadasd
sadsa dadasd

Was ist der Unterschied zwischen & Und && in C?

Mein Lehrer hat mir dieses Beispiel gegeben:

int a = 8;
int b = 4;
printf("a & b = %d\n", a & b);
printf("a && b = %d\n", a && b);

Ausgang:

a & b = 0;
a && b = 1;

Ich bin mir nicht sicher, warum dies in einem Szenario „true“ und in einem anderen „false“ zurückgeben würde.

  • & Ist bitweise und, && Ist logisch und.

    – Fred Larson

    2. April 2018 um 19:02 Uhr

  • Wenn Sie die Spezifikation beider Operatoren nicht gefunden haben, klicken Sie hier endgültig Sie müssen an Ihren Suchfähigkeiten arbeiten!

    – zu ehrlich für diese Seite

    2. April 2018 um 19:03 Uhr


  • @FredLarson So viel weiß ich, aber ich habe diese bisher nur in Szenarien wie (wenn y > 3 && x < 69) oder so verwendet, nicht so.

    – sadsa dadasd

    2. April 2018 um 19:05 Uhr

  • @hyde C99 hinzugefügt _Bool Typ und stdbool.h mit einer Typdefinition von bool Zu _Bool

    – Christian Gibbons

    2. April 2018 um 19:12 Uhr

  • Ich glaube nicht, dass es zu weit gefasst ist. Es ist leicht zu beantworten. Wenn es kein passendes Duplikat gibt, sollten wir es einfach beantworten.

    – Fred Larson

    2. April 2018 um 19:19 Uhr

Benutzeravatar von klutt
klutt

& Ist bitweise und Und && Ist logisch und.

Der Ausdruck x && y wird zurückkehren 1 wenn beides x Und y ist ungleich Null und 0 ansonsten. Beachten Sie, dass wenn x ist dann Null y wird überhaupt nicht ausgewertet. Das wird wichtig sein, wenn y ist ein Ausdruck mit Nebenwirkungen. Dieses Verhalten nennt man Kurzschluss.

Der Ausdruck x & y führt eine bitweise Operation für jedes einzelne Bit durch x Und y. Also wenn x Ist 1010 in binär und y Ist 1100 Dann x & y werde bewerten 1000. Beachten Sie, dass der Rückgabewert von x & y sollte NICHT als boolescher Wert interpretiert werden, auch wenn dies möglich ist. Im frühen C der Operator && existierte nicht, und aus diesem Grund & wurde hierfür verwendet.

Eine Möglichkeit, es zu erklären, ist, dass man sich das vorstellen kann & ist dasselbe wie eine Bewerbung && auf jedes einzelne Bit in den Operanden.

Beachten Sie das auch & hat niedrigere Priorität als &&, auch wenn die Intuition sagt, dass es umgekehrt sein sollte. Dies gilt auch für Vergleichsoperatoren, z <, <=, ==, !=, >=, >. Dies geht auf die Zeit zurück, als C noch keine Operatoren hatte && Und || und stattdessen wurden die bitweisen Versionen verwendet. Zu diesem Zeitpunkt machte es Sinn, aber als die logischen Operatoren hinzugefügt wurden, war es nicht mehr sinnvoll. Kernighan und Ritchie gaben zu, dass es sinnvoller gewesen wäre, aber sie haben es nicht behoben, weil dadurch der bestehende Code kaputt gehen würde.

Ich bin mir nicht sicher, warum dies in einem Szenario „true“ und in einem anderen „false“ zurückgeben würde.

Der Rückgabewert von x & y sollen nicht überhaupt als boolescher Wert behandelt werden. Es kann jedoch (abhängig davon, wie der Code geschrieben ist) als boolesches Array behandelt werden. Wenn Sie zwei ganze Zahlen haben, flags1 Und flags2 dann das Ergebnis von flags1 & flags2 gibt an, welche Flags aktiviert sind beide flags1 Und flags2.

  • Sollte sein if both x and y are non-zero,. Optional & is the same as a bitwise multiply or bitwise binary and on pairs of corresponding bits in x and y.

    – rcgldr

    2. April 2018 um 19:38 Uhr

  • Sollte sein: & hat eine niedrigere Priorität als die Vergleichsoperatoren <, <=, ==, !=, >=, >. Siehe den Kommentar des Cyclaministen zur ursprünglichen Frage mit dem Beispiel a & b == 1 wird behandelt als a & (b == 1) . Anfangs hatte C keine logischen Operatoren und als Ersatz wurden die binären Operatoren verwendet. Wenn die logischen Operatoren wie && Und || Der C-Sprache wurde der Vorrang binärer Operatoren hinzugefügt &, |Und ^ hätte erhöht werden sollen, aber Kernighan und Ritchie waren besorgt über die Abwärtskompatibilität.

    – rcgldr

    3. April 2018 um 0:36


Benutzeravatar von David R. Tribble
David R. Tribble

Der & Der Bediener führt eine bitweise und Operation an seinen ganzzahligen Operanden, die ein ganzzahliges Ergebnis erzeugt. Daher (8 & 4) Ist (0b00001000 bitand 0b00000100) (aus Gründen der Übersichtlichkeit wird eine binäre Notation verwendet, die in Standard-C nicht vorhanden ist), was zu Folgendem führt: 0b00000000 oder 0.

Der && Der Bediener führt eine logisch und Operation an seinen booleschen Operanden, die ein boolesches Ergebnis erzeugt. Daher (8 && 4) ist äquivalent zu ((8 != 0) and (4 != 0))oder (true and true)was dazu führt true.

Benutzeravatar von MrPickles
MrPickles

&& (logisch und Operator) – Die linken und rechten Operanden sind boolean Ausdrücke. Wenn beide Operanden ungleich Null sinddann wird die Bedingung wahr.

>

& (bitweise und Operator) – Die linken und rechten Operanden sind integral Typen. Binärer UND-Operator kopiert ein bisschen zum Ergebnis wenn es existiert in beiden Operanden.

Im Beispiel Ihres Lehrers a && bder linke Operand 4 und der richtige Operand 8 sind beide ungleich Null. Die Bedingung wird also wahr.

Im anderen Beispiel Ihres Lehrers a & bder linke Operand 4 oder 0100 und der richtige Operand 8 oder 01000 kopiert keine Bits in das Ergebnis. Dies liegt daran, dass es in keinem Operanden gemeinsame gesetzte Bits gibt.

Ich bin überrascht, dass der Lehrer keine zusätzlichen Beispiele mit größeren Zahlen gezeigt hat:

Aussagen:

printf("14 & 18 = %d\n", 14 & 18);
printf("14 && 18 = %d", 14 && 18);

Ausgang:

14 & 18 = 2
14 && 18 = 1

Aussagen:

printf("300 & 400 = %d\n", 300 & 400);
printf("300 && 400 = %d", 300 && 400);

Ausgang:

300 & 400 = 256
300 && 400 = 1

& ist ein bitweiser Operator und && ist logisch. Wenn Sie beispielsweise zwei Zahlen verwenden und einen bitweisen Operator verwenden möchten, können Sie & schreiben. Wenn Sie Phrasen verwenden und diese logisch behandeln möchten, können Sie && verwenden.

  • Willkommen bei Stack Overflow. Auf diese Frage gibt es bereits zwei sehr gute Antworten. Bietet diese neue Antwort Informationen, die noch nicht abgedeckt sind? Bitte lesen Sie „Antworten“.

    – Chris – im Streik

    27. November 2021 um 15:47 Uhr

  • Willkommen bei Stack Overflow. Auf diese Frage gibt es bereits zwei sehr gute Antworten. Bietet diese neue Antwort Informationen, die noch nicht abgedeckt sind? Bitte lesen Sie „Antworten“.

    – Chris – im Streik

    27. November 2021 um 15:47 Uhr

1452070cookie-checkUnterschied zwischen & und && in C?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy