programing

전에 경시하라, 아니면 그 후에 경시하라.

prostudy 2022. 5. 23. 21:31
반응형

전에 경시하라, 아니면 그 후에 경시하라.

시작은 아마 알고 있을 겁니다.const개체의 데이터 또는 포인터를 수정할 수 없거나 둘 다로 만드는 데 사용할 수 있다.

const Object* obj; // can't change data
Object* const obj; // can't change pointer
const Object* const obj; // can't change data or pointer

그러나 다음 구문도 사용할 수 있다.

Object const *obj; // same as const Object* obj;

중요한 것은 별표를 어느 쪽에 붙이는가 하는 것뿐이다.const키워드개인적으로 나는 말하는 것을 선호한다.const왼쪽의 데이터를 특정하기 위해 좌우의 사고방식에서 더 잘 읽히므로 수정할 수 없지만, 어떤 구문이 먼저 나왔을까?

더 중요한 것은 왜 두 가지 정확한 지정 방법이 있는가?const데이터 및 어떤 상황에서 다른 상황보다 데이터를 선호하십니까?

편집:

그래서 내가 태어나기 훨씬 전에 컴파일러들이 사물을 어떻게 해석해야 하는지에 대한 기준이 마련되었을 때 이것은 자의적인 결정이었던 것 같다.이후const키워드 왼쪽에 있는 내용에 적용됨(기본적으로?)최소한 *나 & ...을 구문 분석하여 선언이 변경될 때까지 키워드를 적용하고 다른 방식으로 한정자를 입력하기 위해 "바로 가기"를 추가해도 아무런 해가 없다고 생각했을 것이다.

C에서도 그랬을 것 같은데?

왜 두 가지 정확한 지정 방법이 있는가?const데이터 및 어떤 상황에서 다른 상황보다 데이터를 선호하십니까?

본질적으로, 그 지위가 바로 그 이유.const별표가 나오기 전의 지정자 내에서는 C 문법이 Kernighan과 Ritchie에 의해 그렇게 정의되었다는 것이 중요하지 않다.

그들이 문법을 이런 식으로 정의한 이유는 그들의 C 컴파일러가 입력을 좌우로 구문 분석하여 그것을 소비하면서 각각의 토큰 처리를 끝냈을 가능성이 높다.소비하는 것*토큰은 현재 선언의 상태를 포인터 형식으로 변경한다.맞닥뜨기const다음에*을 의미하다const한정자가 포인터 선언에 적용되며, 이 선언이 시작되기 전에 발생함*한정자가 가리키는 데이터에 적용됨을 의미한다.

왜냐하면 의미적 의미는 다음과 같은 경우에 바뀌지 않기 때문이다.const한정자는 형식 지정자 앞이나 뒤에 나타나며, 어느 쪽이든 허용된다.

기능 포인터를 선언할 때 유사한 종류의 경우가 발생한다. 여기서:

  • void * function1(void)반환되는 함수를 선언하다.void *,

  • void (* function2)(void)함수 포인터를 반환하는 함수에 선언하다.void.

다시 주목해야 할 것은 언어 구문이 좌우 파서를 지원한다는 점이다.

규칙은 다음과 같다.

남아 있는 것에 대해 공구가 적용된다.만약 왼쪽에 아무것도 없다면 그것은 그것의 오른쪽에 적용된다.

나는 단지 그것이 "원래적인" 방식으로 정의된다는 이유만으로 그것이 항상이 되기 위해 사물의 오른쪽에 있는 항상을 사용하는 것을 선호한다.

그러나 나는 이것이 매우 주관적인 관점이라고 생각한다.

나는 두 번째 구문을 선호한다.그것은 내가 유형 선언문을 오른쪽에서 왼쪽으로 읽음으로써 '무엇'이 일정한지 추적하는데 도움을 준다.

Object * const obj;        // read right-to-left:  const pointer to Object
Object const * obj;        // read right-to-left:  pointer to const Object
Object const * const obj;  // read right-to-left:  const pointer to const Object

선언문의 키워드 순서가 그렇게 정해진 것은 아니다."하나의 진정한 질서"에는 많은 대안이 있다.이것처럼.

int long const long unsigned volatile i = 0;

아니면 그럴까

volatile unsigned long long int const i = 0;

??

첫 번째 규칙은 지역 코딩 표준에 필요한 형식을 사용하는 것이다. 후: 퍼팅const예를 들어, 다음과 같이 타이핑에프가 관련될 때 앞부분은 혼란의 끝이 없다.

typedef int* IntPtr;
const IntPtr p1;   // same as int* const p1;

만약 당신의 코딩 표준이 포인터들의 타이페프를 허용한다면, 그 코딩 표준은 정말로 타이프 뒤에 콘스탄트를 넣는 것을 고집해야 한다.형식에 적용하지 않고 모든 경우에 있어서, 항상은 그것이 적용되는 것을 따라야 하기 때문에, 일관성은 또한 이후의 항상성에 찬성한다고 주장한다.그러나 지역 코딩 지침은 이 모든 것을 능가한다; 그 차이는 보통 돌아가서 기존의 모든 코드를 바꿀 만큼 중요하지 않다.

좌파나 우파 중 어느 한쪽이 용납될 수 있는 역사적 이유가 있다.스트루스트럽은 1983년까지 C++에 constulation을 추가했지만, C89/C90이 되어서야 C에 도달했다.

C++에는 항상 오른쪽의 const를 사용해야 하는 충분한 이유가 있다.항상 멤버 기능은 다음과 같이 선언되어야 하기 때문에 어디에서나 일관성이 있을 것이다.

int getInt() const;

C는 좌우 구문을 사용한다.선언문을 오른쪽에서 왼쪽으로 읽으십시오.

int var = 0;

// one is a pointer to a const int
int const * one = &var; 
// two is a pointer to an int const (same as "const int")
const int * two = &var; 

// three is a constant pointer to an int
int * const three = &var;

'콘스탄트'에게 가장 먼저 남겨진 것은 그것에 의해 영향을 받는다.

자세한 내용은 http://cseweb.ucsd.edu/~rko/rt_lt.rule.propert를 참조하십시오.

와 함께

using P_Int = int *;

P_Int const a = nullptr;
int * const b = nullptr;

const P_Int c = nullptr;
const int * d = nullptr;

변수 .수.의 변수들.a그리고b 정도로 변수가 c그리고d서로 같은 타입이 아니다.첫 번째 시나리오에서 혼동을 일으키지 않는 것이 선호된다.const활자의 오른쪽에N.B.는 포인터다.const와 함께ab그리고c; 그러나int이다const와 함께d.

참조URL: https://stackoverflow.com/questions/5503352/const-before-or-const-after

반응형