반응형
왜“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
반응형
'developer tip' 카테고리의 다른 글
NuGet을 사용하여 이전 버전의 패키지 다운로드 (0) | 2020.09.28 |
---|---|
Vim의 외부 명령에 대한 파이핑 버퍼 (0) | 2020.09.25 |
자바 프로그래밍 : 자바에서 exe 호출 및 매개 변수 전달 (0) | 2020.09.25 |
내 변경 사항 만 표시하도록 git 로그 필터링 (0) | 2020.09.25 |
클래스 속성이 정수임을 어떻게 지정합니까? (0) | 2020.09.25 |