C에서 ((c) + 1)의 유형은 무엇입니까?
나는 C에서 같은 표현을 발견했습니다.
typeof((c) + 1) _tmp = c;
이게 정확히 무슨 뜻입니까?
답장 감사합니다.
한 가지 의심?만약 c형이 원시형 대신 구조형이라면 +1은 무엇을 할 것입니까?
그typeof
(C++가 아닌) 플레인 C의 연산자는 표준에 GCC를 추가한 것입니다.괄호 안에 포함된 식의 형식을 사용할 것임을 컴파일러에 알려줍니다.
사용.typeof
위와 같이 다른 변수의 유형을 참조로 사용하여 알 수 없는 유형의 변수를 선언할 수 있습니다.주조에도 사용할 수 있습니다.
그+
내부 작전typeof
독특한 효과가 있습니다. typeof((c) + 1)
"승진 후에도 남는 c형 또는 1형"을 의미합니다.예를 들어, chars는 int를 포함하는 연산에 사용될 때 int로 승격되고, int는 float로 승격되며, float은 double로 승격됩니다.
그렇게,typeof(int_variable + char_variable)
이라int
이래로char
로 승격할 것입니다.int
작업을 수행할 수 있습니다.
컴파일러만 이 문제를 해결할 수 있습니다.typeof
평가하지 않고, 가치가 없으며, 런타임에 아무 일도 일어나지 않습니다.
의 전체 설명typeof
여기서 찾을 수 있습니다.
var 생성_tmp
세인트_tmp
의 유형 업캐스트(최대)입니다.c
또는int
값으로 설정합니다.c
.
예를 들어
char c -> int _tmp // char(c) + 1 is int
float c -> float _tmp // float(c) + 1 is float
다른 대답 외에도,+
여기 꽤 미묘한 점이 있습니다.을 허용합니다.c
식 또는 유형이 될 수 있습니다.
- 만약 그것이 표현이라면, 말한 것처럼,
c
로 승격됨int
(최소한) 그리고 전체 식의 유형은 적어도 정수 순위를 가집니다.int
. - 형식 표현식인 경우 괄호는 다음을 포함합니다.
c
그것을 가치 있는 것으로 삼다.+1
그러면 결과 유형은 그냥c
.
두 종류의 곡예 모두에게 중요합니다.c
산술 유형이며 여기서 이 속임수는 서명된 것을 느슨하게 할 수도 있습니다.c
그래서 이 사용법은typeof
확장은 보기만큼 유용하지 않습니다.대부분의 경우 사용uintmax_t
또는intmax_t
그것으로 충분할 것입니다.
이것은 표준 C가 아닙니다.C에는 다음과 같은 것이 없습니다.typeof
(사용자 정의 항목을 처리하지 않는 한)
typeof
는 일반적으로 컴파일러 확장자(GCC 컴파일러일 가능성이 가장 높음)입니다.당신은 여기에서 그것에 대해 읽을 수 있습니다.
http://gcc.gnu.org/onlinedocs/gcc/Typeof.html
코드를 비교해 보십시오.
typeof((c) + 1) _tmp = c;
와 함께
typeof(c) _tmp = c;
typeof
형식 또는 변수의 인수를 사용할 수 있습니다.이제 고려해 보십시오.c
~하듯이,
struct { int a; int b }
- 의
struct { int a; int b }
- 텍스트
int
.
홍보 뿐만 아니라 char
매크로는 다음으로부터 as per uʍop ǝpısdn보호합니다.struct
제따. 다음 코드는 컴파일이 되지 , 라서다컴않습지다니.
struct { int a; int b } c;
typeof((c)+1) _tmp = c;
사람들은 금지하기를 원할 것입니다.struct
효율성 및 코드 크기 이유, 특히 일반 매크로 내에서의 할당.
형식은 형식을 반환하며 컴파일 시 평가됩니다.
전문은변선의언다미니합을수를 하는 것을 합니다.tmp
c와 동일한 유형(일반적으로).
c+1 유형은 c와 다를 수 있기 때문에 관련되거나 다른 유형을 선언할 수 있습니다(c++에서 더 가능성이 높습니다).
에는 포인터에 제생에는각포, 에대만서해터인,만포서대,▁pointer▁for,typeof((c) + 1) = typeof(c);
따라서 이것은 전달 매개 변수가 포인터임을 보장할 수 있습니다.
언급URL : https://stackoverflow.com/questions/4436889/what-is-typeofc-1-in-c
'programing' 카테고리의 다른 글
"개인 이메일 주소를 게시합니다." 오류 (0) | 2023.06.07 |
---|---|
스키마 유효성 검사에 실패하고 다음 오류가 발생했습니다. 데이터 경로 ".builders['app-shell']"에는 필수 속성 'class'가 있어야 합니다. (0) | 2023.06.07 |
Windows에서 동시에 실행할 수 있는 스레드 수는 몇 개입니까? (0) | 2023.06.02 |
SQL에서 인덱스란 무엇입니까? (0) | 2023.06.02 |
용량이 아닌 특정 크기로 목록을 초기화하는 방법 (0) | 2023.06.02 |