ausdruck[ 'c-'0']



  • hallo,
    ich hab in einigen Programmen den Ausdruck var-'0' in z.b. schleifen entdeckt.Kann mir jemand klar machen wieso ich nicht einfach c schreiben kann.

    BSP für int c und int zahl[10]:
    while((c=getchar())!=EOF)
    if(c>='0' && c<='9')
    ++zahl[c-'0']; /'hier solte ich doch auch einfach c schreiben köönnen oder?

    danke



  • '0'
    ist ein char
    '0'-'0'
    ist ein int, und zwar ein int mit dem wert 0
    wenn wir '0' wie einen int behandeln, dann haben wir einen int mit dem wert x (wobei x != 0 ist (sorry, ich weiss jetzt den ascci wert von 0 nicht))

    '7'-'0' == 7
    '9'-'0' == 9

    verstehst du das prinzip?



  • ganz einfach: '0' ist das Zeichen was für die Ziffer Null steht, aber es hat nicht den Wert 0. Im ASCII-Zeichensatz hat die Null z.B. den Wert 48. Dh dort könnte auch c-48 stehen. Aber zum einen schränkt das die Portabilität ein, da nicht alle Rechner mit dem ASCII-Zeichensatz arbeiten, und zum anderen sind magic numbers immer schlecht -- bei '0' weiß jeder sofort was gemeint ist, bei 48 nicht.



  • verstehst du das prinzip?

    Das natürlich nur gilt, solange die Ziffern im verwendeten Zeichensatz hintereinander ohne Lücken aufsteigend angeordnet sind.

    Aber das ist, wenn ich mich nicht irre, bei allen praktisch verwendeten Zeichensätzen so. Oder irre ich mich?



  • Original erstellt von HumeSikkins:
    solange die Ziffern im verwendeten Zeichensatz hintereinander ohne Lücken aufsteigend angeordnet sind.

    In  both  the
    source and execution basic character sets, the value of each
    character after 0 in the above list of decimal digits  shall
    be  one  greater  than the value of the previous.
    

    -- C99 draft, 5.2.1



  • @Bashar
    Das beantwortet meine Frage. Danke 🙂



  • sorry ich versteh es doch noch nicht so ganz
    Angenommen c sei 2 für ++zahl[c];
    1,)while ist erfüllt
    2.)if ebenfalls
    3.)zähle zahl um einen hoch mit dem index von c also in meinem Fall ++zahl[2]
    so solte es meiner meinung nach sein was jedoch nicht geht....

    wenn ich jetzt c-'0' nehme und 0 hat den ascii wert 48 dann wäre das für c=2 , ++zahl[2-49] also ++zahl[-47] ,ich hab aber zahl als zahl[10] festgesetzt. also dürfte das doch nicht gehen,da zahl[-47]nicht festgelegt ist. 😕

    @Bashar:ja ich komme auch auf c-48,aber das ist doch net definiert für zahl[10]
    @shade of mine:dann müßte ich mir aber doch die -'0' auch sparen können oder?
    @ all:
    einen sinn würde es meiner meinung nach nur machen wenn es heissen würde ++zahl[c+'0']
    denn eine zahl plus den ascii wert von 0 ergibt wieder den ascii wert der zahl also c.

    Bsp:
    für c=2 und ++zahl[c+'0']
    ++zahl[2+48] also ++zahl[50]
    und 50 ist wieder der ascci wert der zahl 2

    das ergibt doch sinn aber [c-'0'] ist mir nicht ganz klar.....

    könnt ihr mir villeicht nochmal helfen?

    danke



  • wenn c=2 ist, dann ist es nicht zwischen '0' und '9', somit greift die if-Bedingung nicht.



  • Original erstellt von Shade Of Mine:
    '0'
    ist ein char

    Nein, ein Integerliteral, dem ein Wert zugrundeliegt, der in einem char gespeichert werden kann. Hier ist nicht nebenan! Da wäre es nämlic wirklich ein Charliteral.

    ChristianM: Du scheinst elementare Verständnisprobleme zu haben.
    Sparen wir uns doch mal das Rumgehampel mit den Literalen, sondern machen ein anderes Beispiel. Zum Beispiel habe ich ein Array a mit n Integerelementen. Ich will wissen, wie oft jede Zahl x für die gilt 10 < x < 20 (in der 'Sprache Mathematik', nicht der 'Sprache C'). Also haben wir:

    int* a, n;
    /* sinnvolle Initialisierungen hier */
    int zaehle_haeufigkeiten_zwischen_10_und_20[9] = { 0 };
    int i;
    for (i = 0; i < n; ++i)
        if (10 < a[i] && a[i] < 20) zaehle_haeufigkeit_zwischen_10_und_20[a[i] - 11];
    /* Ungetestet... */
    

    Jetzt kannst Du für 10 und 20 '0' und '9' einsetzten, die Vergleichsoperatoren austauschen und den Subtrahenden anpassen. Einfach, oder?



  • Original erstellt von Daniel E.:
    Nein, ein Integerliteral, dem ein Wert zugrundeliegt, der in einem char gespeichert werden kann. Hier ist nicht nebenan! Da wäre es nämlic wirklich ein Charliteral.

    stimmt, ich hätte eigentlich 'Buchstabe' schreiben sollen.



  • ich habs verstanden!
    MeinFehler war das ich immer dachte das er die 2 in c ablegt.Jedoch legt er ja den ASCII Wert von 2 in c,da c ein int ist.Also 50.Also ist für c=2 der Ausdruck c[c-'0'] gleich dem Ausdruck c[50-48] was widerum die 2 ist.

    Danke an alle die mir das klar gemacht haben.


Anmelden zum Antworten