developer tip

왜“2i;”

copycodes 2020. 9. 25. 08:01
반응형

왜“2i;” 컴파일러 오류가 발생하지 않습니까?


대신 2*i나는 부주의하게 썼다 2i.

int foo(int i)
{
    2i;
    return 2i;
}

컴파일러가 오류를 잡을 것으로 예상했습니다. 그러나 그렇지 않았습니다. 그렇다면 2iC에서 유효한 진술입니까? 그렇다면 그것은 무엇을합니까? 어찌할 바를 모르는!

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;

2igcc복합 정수 리터럴 확장으로,의 제곱근의 두 배인 순수 허수입니다 -1. 이 확장은에서도 지원됩니다 clang.

로 컴파일 gcc 5.4.0하면 게시 된 어셈블리 출력 생성 된다는 것은 다소 놀랍습니다 .

  • 에 컴파일 http://gcc.godbolt.org/# 것은 내가에서 컴파일 오류가 gcc5.3.0 : http://gcc.godbolt.org/#: error: cannot convert '__complex__ int' to 'int' in return.
  • 함수 foo대해 게시 된 어셈블리 코드 가 올바르지 않습니다.을 반환하지 않습니다 0. 복잡한 정수 상수 2i를로 변환하면 int실수 부분을 반환해야합니다 0.

반대로 clang3.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

반응형