반응형
"2i;"라는 문장이 컴파일러 오류를 일으키지 않는 이유는 무엇입니까?
대신2*i
무심코 썼다.2i
:
int foo(int i)
{
2i;
return 2i;
}
컴파일러가 오류를 검출할 것으로 예상했습니다.하지만 그렇지 않았다.역시 그렇다2i
C로 된 유효한 진술서?그렇다면 어떤 역할을 합니까?당황!
gcc 버전 5.3.0을 사용하여 컴파일한 결과 어셈블리 출력은 다음과 같습니다.
.file "strange.c"
.text
.globl foo
.type foo, @function
foo:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl %edi, -4(%rbp)
nop
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size foo, .-foo
.ident "GCC: (GNU) 5.3.0"
.section .note.GNU-stack,"",@progbits
이것은 gcc 확장입니다.2i
는 가상 상수입니다.따라서 다음과 같은 복소수를 쓸 수 있습니다.
#include <complex.h>
_Complex x = 4 + 5i;
2i
는 입니다.gcc
복소수 리터럴의 확장자, 제곱근의 두 배인 순수한 허수-1
이 확장은 다음에서 지원됩니다.clang
뿐만 아니라.
당신의 컴파일러가 다음과 같다니 다소 놀랍다.gcc 5.4.0
는 게시된 어셈블리 출력을 생성합니다.
- http://gcc.godbolt.org/#에서 컴파일 중 컴파일 오류가 발생하였습니다.
gcc
5.3.0:http://gcc.godbolt.org/#
:error: cannot convert '__complex__ int' to 'int' in return
. - 함수에 대한 게시된 어셈블리 코드
foo
올바르지 않다: 반환되지 않는다.0
. 복소 정수 변환2i
로.int
진짜 부분을 돌려줘야 한다0
.
반대로,clang
3.7은 경고 없이 컴파일하여 최적의 코드를 생성합니다.물론 예상대로는 아닙니다.
foo(int): # @foo(int)
xorl %eax, %eax
retq
이 구문은 임의의 순서로 다른 접미사와 조합할 수 있습니다.다음 코드 컴파일:clang -Weverything
적절한 경고를 하다warning: imaginary constants are a GNU extension [-Wgnu-imaginary-constant]
:
#include <stdio.h>
int main() {
/* complex integer literals */
printf("sizeof(2i) = %zd\n", sizeof(2i));
printf("sizeof(2ui) = %zd\n", sizeof(2ui));
printf("sizeof(2li) = %zd\n", sizeof(2li));
printf("sizeof(2lli) = %zd\n", sizeof(2lli));
/* complex floating point literals */
printf("sizeof(2.i) = %zd\n", sizeof(2.i));
printf("sizeof(2.fi) = %zd\n", sizeof(2.fi));
printf("sizeof(2e0fi) = %zd\n", sizeof(2e0fi));
printf("sizeof(2e0i) = %zd\n", sizeof(2e0i));
/* alternate order */
printf("sizeof(2il) = %zd\n", sizeof(2il));
printf("sizeof(2ill) = %zd\n", sizeof(2ill));
printf("sizeof(2.if) = %zd\n", sizeof(2.if));
return 0;
}
환경에서의 출력은 다음과 같습니다.
sizeof(2i) = 8
sizeof(2ui) = 8
sizeof(2li) = 16
sizeof(2lli) = 16
sizeof(2.i) = 16
sizeof(2.fi) = 8
sizeof(2e0fi) = 8
sizeof(2e0i) = 16
sizeof(2il) = 16
sizeof(2ill) = 16
sizeof(2.if) = 8
구문 색칠 편집기로 마지막 항목 시도;-)
언급URL : https://stackoverflow.com/questions/35183722/why-does-the-statement-2i-not-cause-a-compiler-error
반응형
'sourcecode' 카테고리의 다른 글
개발 모드에서 이 HTML 템플릿을 컴파일하는 데 Vue가 매우 느림 (0) | 2022.07.17 |
---|---|
스프링 컨트롤러에서 파일 다운로드 (0) | 2022.07.17 |
vue.timeout의 구성 요소에 개체 배열 전달 (0) | 2022.07.17 |
JPA의 맵 열거형(고정값 포함)을 지정하시겠습니까? (0) | 2022.07.17 |
컬렉션을 목록으로 변환하는 방법 (0) | 2022.07.17 |