printf로 char 인쇄하기
이 두 코드가 모두 동일합니까?
char ch = 'a';
printf("%d", ch);
쓰레기 값을 찍어낼 수 있습니까?
나는 이것에 대해 혼란스럽습니다.
printf("%d", '\0');
이것은 0을 인쇄할 것입니까 아니면 가비지 값입니까?왜냐면 이걸 할 때.
printf("%d", sizeof('\n'));
4장을 찍습니다.요?sizeof('\n')
4바이트?바이트? C합니다.C++에서도 동일한 것이 1바이트를 인쇄합니다.왜 그런 것일까요?
그래서 여기 주요 질문이 있습니다.
입니다.printf("%d", '\0')
0을 인쇄하기로 되어 있습니다.
C++에서printf("%d", '\0')
쓰레기를 인쇄해야 합니까?
%d
정수를 인쇄합니다. 문자의 ASCII 표현을 인쇄합니다.당신에게 필요한 것은%c
:
printf("%c", ch);
printf("%d", '\0');
합니다의 합니다.'\0'
, 값 0 입니다(0 0 함)을 은합니다.
printf("%d", sizeof('\n'));
이 4합니다이기 합니다.int
A C char
.
값을 ASCII 있습니다.%d
는 정수의 탈출 순서입니다.치의 .printf
인쇄할 때 정수로 표시됩니다.
char ch = 'a';
printf("%d", ch);
에 대해서도 마찬가지입니다.printf("%d", '\0');
를 0 NULL 는 0 됩니다를 서합니다
.sizeof('\n')
C에서 문자에 대한 이 표기법은 해당 ASCII 정수를 나타내기 때문에 4입니다.따라서 '\n'은 정수와 같은 10입니다.
이 모든 것은 바이트에 대한 해석에 달려 있습니다.
주식회사char
다로 합니다.int
표현상으로는 그 정도면 할 수 있습니다. 말이죠그 정도면 모든 질문을 설명할 수 있습니다. 생각해보면 말이죠.
출처 : 브라이언 W의 C 프로그래밍 언어커니건과 데니스 M.리치
당신이 C를 배우고 싶다면 A는 반드시 읽어야 합니다.
또한 이 스택 오버플로 페이지를 참조하십시오. 이 페이지에서는 제가 할 수 있는 것보다 훨씬 더 경험이 많은 사람들이 훨씬 더 잘 설명할 수 있습니다.
에서는 C 와 .'\n'
아니면'a'
활자를 가지다int
()sizeof '\n' == sizeof (int)
C++에서는), C++ 에서는를 합니다.char
.
이 .printf("%d", '\0');
식히 0다;'\0'
이다.int
은 0 입니다.
이 .printf("%d", ch);
다의 에 대한 .ch
ASCII우,'a'
== 97).
#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;
}
네, 운이 좋지 않으면 GARBY를 출력해줍니다.
아주 중요합니다.
printf/sprintf/fprintf 인수의 유형은 관련 형식 유형 char와 일치해야 합니다.
유형이 일치하지 않고 컴파일되면 결과가 매우 정의되지 않습니다.
많은 최신 컴파일러들은 인쇄물에 대해 알고 있으며, 종류가 일치하지 않을 경우 경고를 발행합니다.이런 경고가 나오면 수정합니다.
변수 함수의 인수 형식을 변환하려면 컴파일러가 변환을 수행해야 한다는 것을 알 수 없으므로 캐스트(즉, 명시적 변환)를 제공해야 합니다(인수 형식이 있는 함수 프로토타입에서 가능).
printf("%d\n", (int) ch)
이 예제에서 printf는 스택에 "int"가 있다고 표시됩니다.출연진은 어떤 크기의 리턴이든(보통 긴 정수와 같은) printf는 int를 얻을 수 있도록 합니다.
printf("%d", (int) sizeof('\n'))
언급URL : https://stackoverflow.com/questions/4736732/printing-a-char-with-printf
'programing' 카테고리의 다른 글
$httpBackend에 있을 때와 예상할 때의 차이는 무엇입니까? (0) | 2023.10.02 |
---|---|
if 문에 여러 값에 대한 클래스가 JQuery.has에 있습니다. (0) | 2023.10.01 |
도커 무시:파일과 도커 파일을 제외한 모든 것을 무시합니다. (0) | 2023.10.01 |
Oracle에서 테이블 행에 대해 작성된 날짜-시간은 언제입니까? (0) | 2023.10.01 |
인증 유형을 표준에서 cashing_sha2_password로 변경하는 MySQL (0) | 2023.10.01 |