Verschachtelte Kommentare in C/C++

Lesezeit: 2 Minuten

Benutzeravatar von Pritpal
Pritpal

Dies ist eine Interviewfrage: –

Schreiben Sie ein C-Programm, das, wenn es kompiliert und ausgeführt wird, eine Meldung ausgibt, die angibt, ob der Compiler, mit dem es kompiliert wurde, die Verschachtelung von /* */ Kommentaren zulässt.

Die Lösung für dieses Problem ist unten angegeben: –

Sol:- Sie können ein Integer-Variablen-Nest haben:

int nest = /*/*/0*/**/1;

Wenn es verschachtelte Kommentare unterstützt, ist die Antwort 1, sonst ist die Antwort 0.

Wie funktioniert das? Ich verstehe die Variablendeklaration nicht.

  • Ein weiterer angenehmer Code ist strlen(/*/*/"*/*/"/*"/**/). Dies ist eine coole Übung für Websites wie Code Golf, aber als Interviewfrage höchst ungeeignet.

    – Przemek

    21. Oktober 2020 um 18:38 Uhr

Benutzeravatar von Femaref
Frauref

Wenn der Compiler keine Verschachtelung zulässt, wird die erste */ wird das Öffnen des mehrzeiligen Kommentars beenden, dh die 0 wird nicht auskommentiert. Mit einigen Leerzeichen geschrieben:

int nest = /*/*/ 0 * /**/ 1;

was zum Code führt

int nest = 0 * 1; // -> 0

Wenn es Verschachtelung erlaubt, wird es sein

int nest = /*/*/0*/**/ 1;

ergebend

int nest = 1;

  • Es ist nicht unbedingt das letzte überhaupt */ in der Datei, die es beenden würde, wenn es Verschachtelung unterstützt. Wenn das damals so wäre /**/0*1/**/ würde mich nicht als registrieren 0*1, sondern als Kommentar. Mit oder ohne Verschachtelung sollte der Compiler dies so sehen 0*1

    – redbmk

    14. Juli 2011 um 19:17 Uhr

  • Da der SO-Syntax-Highlighter keine Verschachtelung unterstützt, suggeriert die Hervorhebung im letzten Beispiel amüsanterweise die Semantik des ersten Beispiels ^_^

    – Leichtigkeitsrennen im Orbit

    28. Februar 2018 um 11:45 Uhr


Die kurze Antwort auf “Wie funktioniert das?” lautet:

int nest = /*/*/0*/**/1;

mit verschachtelten Kommentaren wird so etwas wie:

int nest = 
// /* (comment level 1) 
//    /*/ (comment level 2) 
//         0
//    */*
// */
1;

und ohne, das zusätzliche * macht es:

int nest = 
// /*/ (comment level 1) 
// */
        0
    *
// /*
// */
1;

oder 0*1.

Oder ich denke, das ist, was passiert, aber diese Frage ist so ziemlich eine Katastrophe. Ich stimme dem Kommentar von Blagovest Buyukliev vollkommen zu.

int nest = /*/*/0*/**/1;

Verschachtelung nicht erlaubt

Wenn Verschachtelung NICHT erlaubt ist, ist der Bereich des ersten Kommentars:

           vvvvv
int nest = /*/*/0*/**/1;

Nachdem dieser Kommentar entfernt wurde (Lücke zur besseren Lesbarkeit gelassen – der C++-Präprozessor ersetzt ein einzelnes Leerzeichen, bei C nicht sicher), ist der nächste Kommentar:

                  vvvv
int nest =      0*/**/1;

Damit auch entfernt:

int nest =      0*    1;

Verschachtelung erlaubt

Unter dem |+- Zeile zeigt den Umfang des äußeren Kommentars und vvvvvv gibt den Umfang des inneren Kommentars an.

           +---------+
           |         |
           | vvvvvv  |
int nest = /*/*/0*/**/1;

Nachdem diese Kommentare entfernt wurden:

int nest =            1;

Wenn es verschachtelte Kommentare unterstützt, haben Sie (Entfernen der Kommentare):

int nest = 1;

Wenn dies nicht der Fall ist, haben Sie (Entfernen der Kommentare):

int nest = 0 * 1;

Das ist eine große Tüte abscheulicher Verletzungen. Meine Vermutung ist, dass der dritte / hebt möglicherweise den zweiten mehrzeiligen Kommentarblock auf und rendert die * nach der Null eine Multiplikation, also:

/* */0 * /* */ 1 == 0 * 1 == 0 // ==> nested comments aren't supported.

Benutzeravatar von RocketR
RocketR

Wenn der Compiler verschachtelte Kommentare versteht, entfernt er einfach die /*/*/0*/**/ Teil und lass dich mit dem int nest = 1.

Sonst wird es sehen int nest = 0*1 Und 0 * 1 == 0.

1444000cookie-checkVerschachtelte Kommentare in C/C++

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

Privacy policy