문제

나는 변수가 사용될 순서대로 ANSI-C에서 코딩하는 경우 포인터가 널이 아니며 인덱스가 경계 내에 있으며 변수 사용 직전에 초기화한다고 주장했다.

const를 선언하면 어설 션과 코드 블록 후에 초기화 할 수 있습니까? Java에서 최종 초기화는 선언에서 발생해야하지만 ANSI-C 구현을 통해 일관되게 선언 당시 Const를 초기화 할 수는 없지만 반드시 초기화 할 수는 없습니까?

도움이 되었습니까?

해결책

Java 컴파일러에는 소량의 유량 논리가있어 비활성화 할 수 있습니다. final 선언 후 변수. 이것은 합법적 인 자바입니다 :

final int something;

if ( today == Friday )
    something = 7;
else
    something = 42;

Java는 모든 지점이 최종 가치를 정의하지 않은 상태로 유지하는지 감지합니다. 조건을 분석하지 않으므로 논리적으로 유사하더라도 합법적 인 Java가 아닙니다.

final int something;

if ( today == Friday )
    something = 7;

if ( today != Friday )
    something = 42;

ANSI C89에서 const 변수 (다른 extern )는 그들이 선언 한 진술에서 초기화되어야합니다.

const int something = ( today == Friday ) ? 7 : 42;

그만큼 extern 선언의 수정자는 컴파일러에게 변수가 다른 합의 장치 (또는이 컴파일 장치의 다른 곳)에서 초기화되었음을 알려줍니다.

ANSI C99에서는 선언과 코드를 혼합하여 A를 선언하고 초기화 할 수 있습니다. const 어설 션 및 코드 블록 후 변수. 1999 년의 휴대 성 ANSI C는 여전히 문제입니다.

C89를위한 작업은 기능 범위가 아닌 블록 범위에서 코드가 작동하는 선언 규칙이 다음과 같습니다.

#include<stdio.h>

int main ( void )
{
    printf ( "wibble\n" );

    {
        const int x = 10;

        printf ( "x = %d\n", x );
    }

    return 0;
}

다른 팁

const 변수는 읽기 전용이며 정의 된 위치에 초기화해야합니다.

이 코드는 생성됩니다 error: assignment of read-only variable 'foo' (GCC4) :

const int foo;
foo = 4;

Const Pointers도 마찬가지입니다 (여기 : 여기 : 참고 : const int * Const 포인터가 아니라 Const에 대한 포인터) :

int * const foo;
foo = 4;

C89에서도 여분의 범위를 위해 베어 블록을 도입하여 정의를 첫 번째 사용 지점에 더 가깝게 이동할 수 있습니다. 전에:

int a, b, c;

a = 12;
// do some stuff with a

b = 17;
// do some stuff with a and b

c = 23;
// do some stuff with a, b, and c

후에:

int a = 12;
// do some stuff with a
{
    int b = 17
    // do some stuff with a and b
    {
        int c = 23;
        // do some stuff with a, b and c
    }
}

물론 C99를 사용하면 블록의 시작 이외의 변수를 정의 할 수 있습니다.

int a = 12;
// do some stuff with a

int b = 17
// do some stuff with a and b

int c = 23;
// do some stuff with a, b and c

기능 본문 내에서 선언 후 Const를 초기화 할 수는 없지만 주장 후 한 블록을 열 수 있습니다.

void func()
{
    int y;
    //do assertions
    assert(something);
    {
        int const x = 5;
        // function body
     }
}

블록 범위와 C99 선언 방법이 부족하여 다른 표시가 표시되면 대답은 아니오입니다. const 변수의 초기화를 연기 할 수 없습니다. 어쨌든 Const는 로컬 변수에 그다지 유용하지 않습니다. C에서 const 키워드를 사용하는 주 시간은 다음과 같습니다.

  • 기능이 점수를 수정하지 않는 계약을 기리는 기능 인수 (또는 인수에 기초한 로컬 변수 포인터)의 포인터. Const 키워드는 기능 구현이 수정하지 않아야하는 요구 사항을 존중하도록 (CONS를 제거하기위한 특별한 노력이 필요합니다) 여러 기능 호출을 통해이 요구 사항이 전파 할 수 있도록 도와줍니다.
  • 컴파일 타임 상수 테이블 (조회 테이블, 사전 정의 된 영구 개체 등)을 선언하려면 바이너리의 읽기 전용 섹션에 저장하려면 런타임에 추가 물리적 자원을 사용하지 않습니다.

독자가 함수를 이해하는 데 도움이 될 것이라고 생각하면 때때로 로컬 변수를 선언하지만 매우 드 rare니다.

정의를 나누는 것에 대해 이야기하고 있다면

const int x = 2;

두 부분으로 :

const int x;

x=2;

C에서는 불가능한 것 같습니다.

내가 당신이라면, 나는 당신이 설명하는 코딩 규칙의 의도를 이해하려고 노력할 것입니다. 제정신 코딩 규칙이 초기화 변수 (심지어 초기 변수)를 방지 할 것을 의심합니다.

다양한 의견에 대한 응답으로 :

const int * p;

const 변수의 선언이 아닙니다. Const int에 대한 비 초가 포인터 변수의 선언입니다.

당신은 선언 할 수 있습니다

extern const int x;

그러나 코드를 실행 한 후에도 여전히 X를 초기화 할 수 없습니다.

LHS에서 Const를 캐스트하고 싶다면 이건 어때요?

const int n = 0;

*((int*)&n) = 23;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top