“&&” und “and”-Operator in C

Lesezeit: 8 Minuten

Benutzer-Avatar
hackt

Ich versuche den größten gemeinsamen Nenner zweier ganzer Zahlen zu berechnen.

C-Code:

#include <stdio.h>

int gcd(int x, int y);

int main()
{
    int m,n,temp;
    printf("Enter two integers: \n");
    scanf("%d%d",&m,&n);
    printf("GCD of %d & %d is = %d",m,n,gcd(m,n));
    return 0;  
}

int gcd(int x, int y)
{
    int i,j,temp1,temp2;

    for(i =1; i <= (x<y ? x:y); i++)
    {
        temp1 = x%i;
        temp2 = y%i;
        if(temp1 ==0 and temp2 == 0)
            j = i;
    } 
    return j;         
}

Beachten Sie in der if-Anweisung den logischen Operator. es ist and nicht && (aus Versehen). Der Code funktioniert ohne Warnung oder Fehler.

Ist dort ein and Operator in C? ich benutze orwellDev-C++ 5.4.2 (ein c99 Modus).

Benutzer-Avatar
Shafik Yaghmur

&& und and sind alternative Token und sind funktionell gleich, von Abschnitt 2.6 Alternative Token von dem C++-Standardentwurf:

Alternative Primary
    and       &&

Ist einer der Einträge in der Tabelle 2 – Alternative Token und es heißt in Unterabschnitt 2:

In allen Belangen der Sprache verhält sich jedes alternative Token bis auf die Schreibweise genauso wie sein primäres Token. Der Satz alternativer Token ist in Tabelle 2 definiert.

Wie Potatoswatter betont, mit and wird höchstwahrscheinlich die meisten Menschen verwirren, also ist es wahrscheinlich besser, dabei zu bleiben &&.

Wichtig zu beachten, dass in Visual Studio ist keine Beschwerde in C++ und hat es anscheinend nicht vor.

Bearbeiten

Ich füge eine C-spezifische Antwort hinzu, da dies ursprünglich eine Antwort auf eine C++-Frage war, aber zusammengeführt wurde. Ich füge das relevante Zitat aus der hinzu C99-Standardentwurf das ist Abschnitt 7.9 Alternative Schreibweisen <iso646.h> Absatz 1 sagt:

Der Header definiert die folgenden elf Makros (links), die zu den entsprechenden Token (rechts) erweitert werden:

und enthält diese Zeile sowie mehrere andere:

and    &&

Wir können auch eine gute Referenz finden hier.

Aktualisieren

Wenn ich mir Ihr neuestes Code-Update ansehe, bin ich mir nicht sicher, ob Sie wirklich im C-Modus kompilieren, der Versionshinweise für OrwellDev 5.4.2 sagen, dass es GCC 4.7.2 verwendet. Ich bekomme das auch nicht zum einbauen gcc-4.7 Noch gcc-4.8 verwenden -x c Um in den C-Sprachmodus zu wechseln, siehe die Live-Code hier. Obwohl, wenn Sie das kommentieren gcc Linie und Verwendung g++ es baut ok. Es baut auch ok darunter gcc wenn Sie auskommentieren #include <iso646.h>

  • Nun, der andere Unterschied ist der, wenn Sie schreiben and, werden die meisten Leser verwirrt sein. Vor allem, wenn Sie es wie in zB schreiben int a, b, and c = a;

    – Kartoffelklatsche

    12. August 2013 um 12:01 Uhr


  • Ich würde nicht zustimmen, dass es für “die meisten Leser” verwirrend ist. Es ist nur verwirrend für diejenigen, die C und C++ genug kennen, um sich an das Sehen zu gewöhnen && kenne aber keine alternativen Token (oder iso646.h im Fall von C). Es ist nicht verwirrend für diejenigen, die sich mit alternativen Token (selten) auskennen, oder für diejenigen, die anfangen (ich würde behaupten, dass dies tatsächlich der Fall wäre weniger verwirrend für letztere und wahrscheinlich zahlenmäßig größte Gruppe)

    – Jo

    12. August 2013 um 12:12 Uhr


  • @Joe Kann das jemand sagen, ohne etwas über alternative Token zu wissen and hat Kurzschlussverhalten und die RHS wird nicht ausgewertet, wenn die LHS es ist false? Und was ist mit anderen Verwendungen ohne Operator wie in meinem obigen Beispiel?

    – Kartoffelklatsche

    12. August 2013 um 12:13 Uhr

  • @Potatoswatter Der erste Punkt ist kein Argument, da er gleichermaßen gilt && für Leute, die keine C++-Erfahrung haben (für wen and hat den Vorteil, dass tatsächlich gesagt wird, was es bedeutet). Nicht-Operator-Verwendungen in Rvalue-Referenzen sind eine andere Sache (obwohl Ihr Beispiel nicht gültig ist) und sollten natürlich vermieden werden.

    – Jo

    12. August 2013 um 12:17 Uhr


  • @ Potatoswatter Ich glaube das eigentlich nicht sind die Mehrheit. Und für diejenigen, die Erfahrung mit anderen Sprachen haben, gibt es viele kurzschließende Logikoperatoren mit ausgeschriebenen Namen (und, oder, nicht), zum Beispiel: Python (das viele für die Verwendung dieser anstelle von && loben, ironischerweise nicht wissend, dass C++ es unterstützt und, oder, und auch nicht)

    – Jo

    12. August 2013 um 12:34 Uhr

Benutzer-Avatar
Chollida

Sehen Sie sich die Seite hier an iso646.h

Dieser Header definiert 11 Makros, die die Textäquivalente einiger allgemeiner Operatoren sind.
and ist eine der Definitionen.

Beachten Sie, dass ich dies nur für einen C++-Compiler testen kann, daher bin ich mir nicht sicher, ob Sie dies mit einem strikten C-Compiler verwenden können.

BEARBEITEN Ich habe es gerade mit einem C-Compiler getestet hier und es funktioniert.

  • @chollida; Der angegebene Link hat die Dinge richtig erklärt. Danke für den Link. Ihre Antwort sollte akzeptiert werden.

    – Hacken

    28. Juni 2013 um 13:37 Uhr

  • In C++ ist die <iso646.h> Header ist ein No-Op; die Schlüsselwörter sind Schlüsselwörter in C++, ohne dass ein Header enthalten ist.

    – Jonathan Leffler

    31. August 2013 um 5:21 Uhr

Benutzer-Avatar
Pierre Fourgeaud

and ist nur ein alternatives Token für &&.

Wir können die Norm hier leicht zitieren:

2.6 Alternative Token [lex.digraph]

In allen Belangen der Sprache verhält sich jedes alternative Token bis auf die Schreibweise genauso wie sein primäres Token. Der Satz alternativer Token ist in Tabelle 2 definiert.

In Tabelle 2:

   Alternative | Primary
        and    |    &&

Aber ich empfehle Ihnen zu verwenden &&. Personen, die an C/C++ gewöhnt sind, können verwirrt werden and


Da es jetzt zusammengeführt wird, sprechen wir auch über C, Sie können diese Seite überprüfen ciso646 Definieren der alternativen Tokens.

Dieser Header definiert 11 Makrokonstanten mit alternativen Schreibweisen für diejenigen C++-Operatoren, die nicht vom ISO646-Standardzeichensatz unterstützt werden.

Aus dem C99-Standardentwurf:

7.9 Alternative Schreibweisen <iso646.h>

Der Header definiert die folgenden elf Makros (links), die zu den entsprechenden Token (rechts) erweitert werden:

   and    &&

  • Meinst du ANSI für “Standard”?

    – hich9n

    12. August 2013 um 12:00 Uhr

  • @paykoob ich meine die Entwurf des C++-Standards.

    – Pierre Fourgeaud

    12. August 2013 um 12:06 Uhr

  • Es ist auch in den Standards ISO/IEC 14882:1998/2011 enthalten

    – Jo

    12. August 2013 um 12:07 Uhr

  • @paykoob C++ ist von ISO standardisiert, von der ANSI Mitglied ist. Pierre, N3690 ist bereits draußen.

    – Kartoffelklatsche

    12. August 2013 um 12:07 Uhr

  • @Potatoswatter Danke, das wusste ich nicht. Das werde ich jetzt verwenden 🙂 C++-Standardentwurf n3690 falls es jemand haben möchte.

    – Pierre Fourgeaud

    12. August 2013 um 12:12 Uhr

Benutzer-Avatar
Thijser

Grundsätzlich and ist nur die Textversion von && in c. Sie müssen jedoch #include <iso646.h>. oder es wird nicht kompiliert.

Hier können Sie mehr lesen:
http://msdn.microsoft.com/en-us/library/c6s3h5a7%28v=vs.80%29.aspx

Benutzer-Avatar
Keith Thompson

Wenn der Code in Ihrer Frage fehlerfrei kompiliert wird, kompilieren Sie entweder nicht wirklich im C99-Modus oder (weniger wahrscheinlich) Ihr Compiler ist fehlerhaft. Oder der Code ist unvollständig, und es gibt eine #include <iso646.h> die du uns nicht gezeigt hast.

Höchstwahrscheinlich rufen Sie Ihren Compiler tatsächlich im C++-Modus auf. Um dies zu testen, versuchen Sie, eine Deklaration wie die folgende hinzuzufügen:

int class;

Der AC-Compiler akzeptiert dies; ein C++-Compiler wird es als Syntaxfehler ablehnen, da class ist ein Schlüsselwort. (Dies ist möglicherweise etwas zuverlässiger als das Testen der __cplusplus Makro; Ein falsch konfiguriertes Entwicklungssystem könnte möglicherweise einen C++-Compiler mit dem Präprozessor im C-Modus aufrufen.)

In C99 die Kopfzeile <iso646.h> definiert 11 Makros, die alternative Schreibweisen für bestimmte Operatoren bieten. Einer davon ist

#define and &&

Du kannst also schreiben

if(temp1 ==0 and temp2 == 0)

in C nur wenn du eine hast #include <iso646.h>; andernfalls ist es ein Syntaxfehler.

<iso646.h> wurde der Sprache durch die 1995er Änderung des ISO C-Standards von 1990 hinzugefügt, sodass Sie nicht einmal einen C99-kompatiblen Compiler benötigen, um sie zu verwenden.

In C++ ist der Header unnötig; die gleichen Token, die von C’s als Makros definiert werden <iso646.h> sind eingebaute alternative Schreibweisen. (Sie sind im gleichen Abschnitt des C++-Standards 2.6 definiert [lex.digraph]wie die Digraphen, aber eine Fußnote stellt klar, dass der Begriff “Digraph” nicht für lexikalische Schlüsselwörter wie gilt and.) Wie der C++-Standard sagt:

In allen Belangen der Sprache verhält sich jedes alternative Token bis auf die Schreibweise genauso wie sein primäres Token.

Du könnte verwenden #include <ciso646> in einem C++-Programm, aber es hat keinen Sinn (obwohl es das Verhalten von beeinflussen wird #ifdef and).

Ich würde tatsächlich nicht raten, die alternativen Token zu verwenden, weder in C noch in C++, es sei denn, Sie müssen es wirklich (sagen wir, in dem sehr seltenen Fall, in dem Sie sich auf einem System befinden, auf dem Sie nicht einfach in die & Charakter). Obwohl sie für Nicht-Programmierer besser lesbar sind, sind sie es wahrscheinlich weniger lesbar für jemanden mit guten Kenntnissen der Sprache C und/oder C++ – wie die Tatsache zeigt, dass Sie diese Frage stellen mussten.

  • +1 Das ist eine nette schnelle Möglichkeit zu testen, ob Sie im C++-Modus kompilieren

    – Shafik Yaghmour

    15. August 2013 um 21:43 Uhr

Benutzer-Avatar
China

Es wird für Sie kompiliert, weil ich denke, dass Sie die Header-Datei iso646.h (ciso646.h) eingeschlossen haben. Demnach ist und identisch mit &&. Wenn Sie das nicht einschließen, gibt es einen Compilerfehler.

  • +1 Das ist eine nette schnelle Möglichkeit zu testen, ob Sie im C++-Modus kompilieren

    – Shafik Yaghmour

    15. August 2013 um 21:43 Uhr

Benutzer-Avatar
P0W

Das and Operator ist das Textäquivalent von && Ref- UND-Operator

Das or Operator ist das Textäquivalent von || Ref.- OR-Operator

So resA und resB sind identisch.

1311480cookie-check“&&” und “and”-Operator in C

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

Privacy policy