Wird dies 0 oder Müllwert drucken? Denn wenn ich das mache
printf("%d", sizeof('\n'));
Es druckt 4. Warum ist sizeof('\n') 4 Bytes? Dasselbe in C++ gibt 1 Byte aus. Warum ist das so?
Hier ist also die Hauptfrage
in C-Sprache ist printf("%d", '\0') soll 0 ausgeben
und in C++ printf("%d", '\0') Soll Müll drucken?
%d druckt eine Ganzzahl: Es wird die ASCII-Darstellung Ihres Zeichens gedruckt. Was Sie brauchen, ist %c:
printf("%c", ch);
printf("%d", '\0'); druckt die ASCII-Darstellung von '\0'was 0 ist (indem Sie 0 maskieren, weisen Sie den Compiler an, den ASCII-Wert 0 zu verwenden.
printf("%d", sizeof('\n')); gibt 4 aus, weil ein Zeichenliteral ein ist intin C und nicht a char.
@nightcracker: hm? Wenn printf("%d", ch); “druckt einen Müllwert”, ich denke, weil er drucken wollte Aanstelle seines ASCII-Werts …
– Junge
19. Januar 2011 um 15:02 Uhr
Er hat nie gesagt, dass irgendetwas einen Müllwert gedruckt hat, er hat gefragt, ob es so ist oder nicht.
– orlp
19. Januar 2011 um 15:04 Uhr
@nightcracker: hm, was ist der unterschied? Ich verstehe deinen Punkt nicht.
– Junge
19. Januar 2011 um 15:19 Uhr
Einfach ausgedrückt, Ihre Antwort ist keine Antwort auf die Frage des OP. Er war einfach neugierig auf die Ergebnisse von %d Druckzeichen, %c ist völlig unabhängig.
– orlp
19. Januar 2011 um 15:26 Uhr
Das ist eigentlich genau das, wonach ich gesucht habe (über die Suchmaschine hierher gekommen). Auch wenn es die ursprüngliche Frage von OP nicht beantwortet, wird es anderen helfen
– bobroxsox
23. Februar 2017 um 21:54 Uhr
Dies soll den ASCII-Wert des Zeichens als ausgeben %d ist die Escape-Sequenz für eine ganze Zahl. Also der Wert, der als Argument von angegeben wird printf wird beim Drucken als Integer genommen.
char ch="a";
printf("%d", ch);
Gleiches gilt für printf("%d", '\0');wobei das NULL-Zeichen als Ganzzahl 0 interpretiert wird.
Endlich, sizeof('\n') ist 4, weil in C diese Schreibweise für Zeichen für die entsprechende ASCII-Ganzzahl steht. Also ist ‘\n’ dasselbe wie 10 als ganze Zahl.
Es hängt alles von der Interpretation ab, die Sie den Bytes geben.
+1, also gibt printf(“%d”, ch) (int) 97 und printf(“%d”, ‘\0’) (int) 0 aus
– Schwarzbär
19. Januar 2011 um 15:12 Uhr
Ich würde das sagen als “Also ist ‘\n’ ein Int, 32 Bit, 4 Bytes und sizeof() gibt 4 zurück Wert von ‘\n’ ist 10, dezimal. NEWLINE in ASCII.” Der ursprüngliche einzelne Satz ist wahr, aber vielleicht zu knapp.
– Rechnung IV
8. April 2011 um 23:20 Uhr
Orlp
In C char wird befördert int in Ausdrücken. Das erklärt so ziemlich jede Frage, wenn man darüber nachdenkt.
Quelle: Die Programmiersprache C von Brian W.Kernighan und Dennis M.Ritchie
Unbedingt lesen, wenn man C lernen möchte.
Sehen Sie sich auch diese Stapelüberlaufseite an, auf der Leute, die viel erfahrener sind als ich, es viel besser erklären können als ich es jemals kann.
@BlackBear: Ja, weil (auf den meisten Systemen) ein Zeichen ein Byte und ein Int vier ist, also ist es eine Beförderung.
– orlp
19. Januar 2011 um 15:02 Uhr
Ich zitiere wörtlich das Buch, sie verwenden das Wort Werbung. Es ist dasselbe wie ein int-Cast (glaube ich).
– orlp
19. Januar 2011 um 15:06 Uhr
Ich gebe dir +1 für den Link. Das Wort Promotion verwirrt mich zwar immer noch, aber ich denke, du bist klar ;).
– Benutzer418748
19. Januar 2011 um 15:09 Uhr
Der Begriff “Promotion” wird auch im C-Sprachstandard, Abschnitt 6.3.1.1 verwendet.
– Johannes Bode
19. Januar 2011 um 15:26 Uhr
Die Promotion-Erklärung ist nicht sehr präzise. sizeof('a') ist 4 aber sizeof(ch) ist 1 wenn ch ist ein char. In C ist der Ausdruck 'a' ist das gleiche wie (int) 97. Es gibt keine Förderung. In C++ hat dieser Ausdruck jedoch einen Typ char.
– scoffey
19. Januar 2011 um 15:38 Uhr
In C können Zeichenkonstantenausdrücke wie z '\n' oder 'a' Typ haben int (daher sizeof '\n' == sizeof (int)), während sie in C++ Typ haben char.
Die Aussage printf("%d", '\0'); sollte einfach 0 ausgeben; die Art des Ausdrucks '\0' ist intund sein Wert ist 0.
Die Aussage printf("%d", ch); sollte die Ganzzahlcodierung für den Wert in ausgeben ch (für ASCII, 'a' == 97).
Spinooosa
#include <stdio.h>
#include <stdlib.h>
int func(char a, char b, char c) /* demonstration that char on stack is promoted to int !!!
note: this promotion is NOT integer promotion, but promotion during handling of the stack. don't confuse the two */
{
const char *p = &a;
printf("a=%d\n"
"b=%d\n"
"c=%d\n", *p, p[-(int)sizeof(int)], p[-(int)sizeof(int) * 2]); // don't do this. might probably work on x86 with gcc (but again: don't do this)
}
int main(void)
{
func(1, 2, 3);
//printf with %d treats its argument as int (argument must be int or smaller -> works because of conversion to int when on stack -- see demo above)
printf("%d, %d, %d\n", (long long) 1, 2, 3); // don't do this! Argument must be int or smaller type (like char... which is converted to int when on the stack -- see above)
// backslash followed by number is a oct VALUE
printf("%d\n", '\377'); /* prints -1 -> IF char is signed char: char literal has all bits set and is thus value -1.
-> char literal is then integer promoted to int. (this promotion has nothing to do with the stack. don't confuse the two!!!) */
/* prints 255 -> IF char is unsigned char: char literal has all bits set and is thus value 255.
-> char literal is then integer promoted to int */
// backslash followed by x is a hex VALUE
printf("%d\n", '\xff'); /* prints -1 -> IF char is signed char: char literal has all bits set and is thus value -1.
-> char literal is then integer promoted to int */
/* prints 255 -> IF char is unsigned char: char literal has all bits set and is thus value 255.
-> char literal is then integer promoted to int */
printf("%d\n", 255); // prints 255
printf("%d\n", (char)255); // prints -1 -> 255 is cast to char where it is -1
printf("%d\n", '\n'); // prints 10 -> Ascii newline has VALUE 10. The char 10 is integer promoted to int 10
printf("%d\n", sizeof('\n')); // prints 4 -> Ascii newline is char, but integer promoted to int. And sizeof(int) is 4 (on many architectures)
printf("%d\n", sizeof((char)'\n')); // prints 1 -> Switch off integer promotion via cast!
return 0;
}
Bitte beschränken Sie Ihre Zeilen auf 90 Zeichen. Eine Hälfte Ihres Textes ist ausgeblendet.
– AL
28. Februar 2014 um 23:03 Uhr
@AL Beschuldigen Sie diese verrückten hochauflösenden 16: 9-Displays! Mit dem programmiererfreundlichen Seitenverhältnis von 4:3 würde niemand jemals so verrückte lange Zeilen schreiben 😉
– BitTickler
17. Februar 2021 um 0:00 Uhr
Jens
Ja, es druckt GARBAGE, es sei denn, Sie haben Glück.
SEHR WICHTIG.
Der Typ des Arguments printf/sprintf/fprintf MUSS mit dem zugehörigen Formattyp char übereinstimmen.
Wenn die Typen nicht übereinstimmen und kompiliert wird, sind die Ergebnisse sehr undefiniert.
Viele neuere Compiler kennen printf und geben Warnungen aus, wenn die Typen nicht übereinstimmen. Wenn Sie diese Warnungen erhalten, BEHEBEN Sie sie.
Wenn Sie Typen für Argumente für Variablenfunktionen konvertieren möchten, müssen Sie die Umwandlung (dh explizite Konvertierung) bereitstellen, da der Compiler nicht herausfinden kann, dass eine Konvertierung durchgeführt werden muss (wie dies bei einem Funktionsprototypen mit typisierten Argumenten der Fall ist). .
printf("%d\n", (int) ch)
In diesem Beispiel wird printf mitgeteilt, dass sich ein „int“ auf dem Stack befindet. Die Umwandlung stellt sicher, dass, was auch immer sizeof zurückgibt (normalerweise eine Art langer Integer), printf ein int erhält.
printf("%d", (int) sizeof('\n'))
Bitte beschränken Sie Ihre Zeilen auf 90 Zeichen. Eine Hälfte Ihres Textes ist ausgeblendet.
– AL
28. Februar 2014 um 23:03 Uhr
@AL Beschuldigen Sie diese verrückten hochauflösenden 16: 9-Displays! Mit dem programmiererfreundlichen Seitenverhältnis von 4:3 würde niemand jemals so verrückte lange Zeilen schreiben 😉
– BitTickler
17. Februar 2021 um 0:00 Uhr
13725600cookie-checkDrucken eines Zeichens mit printfyes