C99 ist ein anderer Name der ISO/IEC 9899:1999 -Standardspezifikation für C, die 1999 angenommen wurde. Dieser Artikel konzentriert sich hauptsächlich auf die neuen Funktionen, die in C99 hinzugefügt wurden, indem er mit dem C89-Standard verglichen wird. In der Entwicklungsphase des C99-Standards wurde jedes Element der C-Sprache erneut untersucht, Nutzungsmuster analysiert und zukünftige Anforderungen antizipiert. Die Beziehung von C zu C++ bildete den Hintergrund für den gesamten Entwicklungsprozess. Der resultierende C99-Standard ist ein Beweis für die Stärken des Originals.

  1. In C99 hinzugefügte Schlüsselwörter:
    • inline : C99 fügt das Schlüsselwort inline hinzu, das auf Funktionen anwendbar ist. Wenn wir den Inline-Datentyp function_name (param) in eine beliebige Funktion schreiben, bedeutet dies, dass wir den Compiler angeben, um Aufrufe dieser Funktion zu optimieren, dh der Code der Funktion wird inline erweitert und nicht aufgerufen.

      Beispiel:




      // C program to demonstrate inline keyword
        
      #include <stdio.h>
        
      inline int maximum(int a, int b)
      {
          return a > b ? a : b;
      }
        
      int main()
      {
          int x = 5, y = 10;
          printf("Maximum of %d and %d is %d",
                 x, y, maximum(x, y));
          return 0;
      }

      Hinweis: Einige Compiler zeigen eine undefinierte Referenz auf maximum(). Diese Inline-Funktion wird selten als Schlüsselwort verwendet.

      Das obige Programm ist äquivalent zu dem folgenden




      #include <stdio.h>
        
      int main()
      {
          int x = 5, y = 10;
          printf("Maximum of %d and %d is %d",
                 x, y, (x > y ? x : y));
          return 0;
      }
      Ausgabe:

      Maximum von 5 und 10 ist 10
      
      Ausgabe:
      Maximum von 5 und 10 ist 10
      

      Inline-Funktionen helfen uns, effizienten Code zu erstellen, indem wir einen strukturierten, funktionsbasierten Ansatz beibehalten.

    • Beschränkung : Beschränkung ist ein Typbezeichner, der nur für Zeiger gilt. Ein durch Beschränkung qualifizierter Zeiger ist zunächst die einzige Möglichkeit, auf das Objekt, auf das er zeigt, zuzugreifen. Der Zugriff auf das Objekt durch einen anderen Zeiger kann nur erfolgen, wenn der zweite Zeiger auf dem ersten basiert.

      Wir verwenden den Einschränkungsqualifizierer, um den Zugriff auf das Objekt einzuschränken. Diese werden hauptsächlich als Funktionsparameter oder in malloc() verwendet . Das Einschränkungskennzeichen ändert niemals die Semantik des Programms.

    • _Bool-Datentyp: Der _Bool-Datentyp wurde im C99-Standard hinzugefügt, der die Werte 0 und 1 speichert. _Bool ist ein ganzzahliger Typ.

      Hinweis: Das Schlüsselwort bool in C++ und _Bool in C sind unterschiedlich.

      _Bool wird selten verwendet, stattdessen definiert C99 eine neue Header-Datei stdbool.h , die drei Makros bool, true und false definiert.

    • _Complex: C99 fügt Unterstützung für Operationen mit komplexen Zahlen durch die Schlüsselwörter _Complex und _Imaginary hinzu. Diese Schlüsselwörter bieten eine bessere Unterstützung für die numerische Programmierung.

      In _Complex definierte Typen:

      • float _Komplex
      • doppelt _Komplex
      • lang doppelt _Complex
    • _Imaginary: Wie oben erwähnt, fügt C99 Unterstützung für die Durchführung von Operationen mit komplexen Zahlen durch die Schlüsselwörter _Complex und _Imaginary hinzu. Diese Schlüsselwörter bieten eine bessere Unterstützung für die numerische Programmierung.

      In _Complex und _Imaginary definierte Typen:

      • float _Imaginär
      • doppelt _imaginär
      • langes Doppel _Imaginary

      Genauso wie im _Bool-Datentyp besprochen, werden diese _Complex und _Imaginary nicht häufig verwendet. Stattdessen verwenden wir die Header-Datei, die aus eingebauten Makros, komplexen und imaginären Makros besteht.

  2. Hinzufügen von Type Qualifiers: Ein weiterer wichtiger Aspekt, der in C99 hinzugefügt wurde, ist die Einführung von Long- Long- und unsigned -Long-Long -Typmodifikatoren. Ein long long int hat einen Wertebereich von –(2^63 – 1) bis +(2^63 –1). Ein unsigned long long int hat einen minimalen Bereich von 0 bis +(2^64 –1). Dieser Long-Long-Typ ermöglicht die Unterstützung von 64-Bit-Ganzzahlen als integrierten Typ.
  3. Änderungen in Arrays: C99 fügte Arrays zwei wichtige Funktionen hinzu:
    • Arrays mit variabler Länge: Im C89-Standard muss die Array-Größe mit ganzzahligen Konstanten bei der Array-Deklaration angegeben werden, und die Array-Größe wird zur Kompilierzeit festgelegt. Im C99-Standard können wir ein Array deklarieren, dessen Dimensionen durch beliebige Integer-Ausdrücke angegeben werden, deren Werte zur Laufzeit bekannt sind. Dies wird als Arrays mit variabler Länge (VLA) bezeichnet .
    • Einbeziehung von Typqualifizierern: In C99 können wir das Schlüsselwort static innerhalb der eckigen Klammern während der Array-Deklaration verwenden. Dies wird nur angewendet, wenn ein Array in Funktionsparametern deklariert ist, dh

      Beispiel:




      int fun1(char arr[static 80])
      {
          // code
      }

      Im obigen Beispiel ist arr immer ein Zeiger auf ein Array mit 80 Elementen, dh arr zeigt garantiert auf das Startelement des Arrays von Zeichen, das mindestens 80 Elemente enthält. Wir können auch die Schlüsselwörter „ restrict “ , „ volatile “ und „const“ innerhalb der eckigen Klammern verwenden, wenn dieses Array innerhalb eines Funktionsparameters deklariert wird. Das Schlüsselwort " restrict " gibt an, dass der Zeiger das einzige anfängliche Zugriffsmittel auf das Objekt ist. const besagt, dass der Zeiger immer auf dasselbe Objekt zeigt. volatile ist erlaubt, hat aber keine Bedeutung.

      Beispiel:




      #include <stdio.h>
      void fun(int a[static 10])
      {
          for (int i = 0; i < 10; i++) {
              a[i] += 1;
              printf("%d ", a[i]);
          }
      }
        
      int main()
      {
          int a[] = { 1, 2, 3, 4,
                      4, 4, 4, 4,
                      5, 5, 6, 7,
                      8, 9, 10 };
          fun(a);
      }
      Ausgabe:
      2 3 4 5 5 5 5 5 6 6
      
  4. Einzeilige Kommentare: Einzeilige Kommentare werden im C89-Standard nicht akzeptiert. Der C99-Standard führt einzeilige Kommentare ein, die nur verwendet werden, wenn kurze Bemerkungen erforderlich sind. Diese Kommentare beginnen mit // und laufen bis zum Ende der Zeile.

    Z.B:




    // First Comment
    int a; // another comment
  5. Deklaration von Bezeichnern:
    Gemäß dem C89-Standard sollten alle Bezeichner am Anfang des Codeblocks deklariert werden. Wenn wir in der Mitte eine andere Kennung benötigen, können wir diese Instanz oder Zeit nicht deklarieren. Das müssen wir am Anfang erklären. C99 hat diese Regel geändert, da wir Bezeichner deklarieren können, wann immer wir sie in einem Code benötigen.

    Vereinfacht können wir das so sehen:




    #include <stdio.h>
    int main()
    {
        int i;
        i = 1;
        int j; // this declaration is invalid in C89 standard, but valid in C99 and C++
        j = 3;
    }
    Ausgabe: