변수가 상수라고하는 것을 이미 알고 있는데 왜 const 키워드를 사용합니까?
내가 읽고 있는 많은 책 const
은 변수의 값을 수정하는 안되는 경우 키워드를 사용합니다 . (주석을 사용하여이 작업을 수행 할 수 있음) 왜 그 키워드가 프로그래밍의 일부가 될 것입니까? 변수를 수정하지 않는 것이 좋습니다.
나를 위해 누군가를 위해 중재 할 수 있습니까?
이 변수를 수정하면 오류가 금지되어 있습니다. 코드 독자에게 지정하는 것 외에도 주석을 사용할 수 있습니다.
"할 수있다"가 아닙니다. 프로그램에 오류 가 발생합니다.
- C ++ 컴파일러는 주석이 필요없이 실패 및 진단 메시지 ( "컴파일러 오류")를 적용합니다.
- AC 컴파일러는 표준 라이브러리 가과 같은 레거시 및 허점을 가지고 대부분 의 경우를 강제로
strchr
,const
이를 아주 쉽게 인식 할 수있는 다소 관대 한 암시 적 변환 규칙이 있습니다 . 그러나 성공하지 못했습니다. 불행하게도, 그것은하지 않는 것이 프로그램에 미묘한 버그 아니라, 큰, 아름다운 충돌 할 수 있다는 것을 의미합니다.
어느 쪽이든 프로그램은 내부 에 오류 를 포함 합니다.
변수를 수정하지 않는 것이 좋습니다.
그게 다 좋지만 완벽한 사람은 없습니다. 프로그래머는 실수를합니다. 이를 통해 컴파일러는 실수를하지 않는 (적어도 보통은 저지 않는) 실수를 지적 할 수 있습니다.
데이터 변수가 생성 된 곳에서 여러 줄의 코드를 사용할 때 특히 유용합니다. 당신이해야 할 일이 아니라 사실을 알고 수정하기가 더 많은 것입니다. 복잡한 코드 기반의 경우 필수입니다.
베이스에서 코드 새로운 측정 가능성 , 정확성 및 안정성 을 얻을 수있을 뿐만 아니라 미묘하고 불쾌한 버그의 가능한 원인에, 대한 거대한 덩어리를 얻을 수 있습니다. (경우에 따라)에 대한 광범위한 최적화 기회 도 있습니다 .
우리는 정말 완벽하게 작업하지 않았고, 하루 종일 프로그램을 사용할 수 있습니다.
사실, 세상에서 완벽한 모든 변수는 const
기본적 으로이며 mutable
변경할 수 있으려면 키워드 로 변수 를 선언해야 우리 합니다. C ++는 거꾸로되어 있습니다.
C ++에서는 const
다른 프로그래머에게 의도를 문서화하는 것 용도가 있습니다.
const
컴파일러에게 몇 가지를 알려줄 수도 있습니다. 예를 들어, 다음과 같이 참조를받는 함수 void f(T &t);
는 매개 변수가 없습니다. 그렇게 될만큼 다음 const
과 같이 참조 를 한정 해야합니다 void f(T const &t)
.
의무적이어야하고 멤버 함수를 호출해야 할 멤버 함수가 다음 const
과 같이 규정 되어야합니다 void T::foo() const {}
..
역할 시스템에서 더 많은 것을 의미 const
할 수 있습니다 . 컴파일러에게 문제의 객체를 알려줍니다 (ROM 대 RAM에 넣음). const
"이 것만으로는 충분하지 않습니다"라고 말하는 것만으로는 충분하지 않습니다.
(C ++ 11에서) const
컴파일러에게 전달 합니다.
이제, (다른 방식으로) const
방식으로 사용되지 않았던 C 또는 C ++와 약간 다른 언어를 정의 할 수있는 것은 의심 할 여지가 없습니다 . 결과는 어느 쪽과도 다소 다른 언어가 될 것입니다. 의도를 모르면 어떻게 될지 말할 수 없지만 Java 또는 C # (몇 가지 예를 들어)에 더 가까워 질 수 있습니다. 둘 다 어떤면에서는 C 및 C ++와 다소 비슷하지만 딱 맞습니다. 하나 (즉, const
C 및 C ++처럼 사용 하지 않습니다).
다른 답변에서 이미 논의 된 프로그래밍 고려 사항 외에도 저와 관련된 태도입니다.
변수를 수정하지 않는 것이 좋습니다.
일반적으로 코드 작성 비용의 20 %가 개발 단계에 사용됩니다. 나머지 80 %는 코드를 업그레이드하고 유지 관리하는 등 코드의 수명 동안 소비됩니다. 이는 다른 많은 사람들이 자신이 아닌 다른 사람의 코드에 대해 작업 할 것임을 의미합니다.
몇 년 후 문제를 방지하기 위해 개발에 소요되는 시간은 좋은 투자입니다. 다음이 포함됩니다. 상수 인 상수 정의; 모호한 언어 구조에 의존 하지 않는 명시 적 코드 작성 .
또한 @worlboss, 상당한 편협함을 들었습니다. 다른 사람들이 저지르고 탄소 단위는 실수를 저지르고 실리콘 단위가 실수를 방지하기 위해 모든 일에 감사했습니다.
변수를 수정하면 안된다고 컴파일러에게 알려주는 누군가 수정하는 코드를 작성하면 컴파일러가 오류로 표시됩니다.
두 가지 이유 :
- 컴파일러 강제 문서
- 컴파일러 최적화
다음은 정상의 인 설명 (에 근무 이안 랜스 테일러에서 gcc
와 gold
링커) :
const의 첫 번째 의미는 프로그램에 영향을 미치는 영향을 미칩니다. const로 선언되지 않은 변수는 const로 선언되지 않은 변수와 다르게 나타날 수 있습니다.
반면에 const의 두 번째 의미는 사실상 컴파일러 강제 문서입니다. const 한정 포인터를 사용하여 값을 변경하려고 할 경우 컴파일러에서 오류가 발생하지만, 그러나 그것이 변경되지 않을 수도 있습니다.
다음은 간단한 C 예제입니다.
void PrintList(const struct List *l);
void SortList(struct List *l);
int CmpList(const struct List *a, const struct List *b);
void AppendList(struct List *l, struct List *m);
void PushList(struct List *l, struct ListNode *n);
void PopList(struct List *l, struct ListNode *n);
여기 작동하는 작은 노드 목록과 함께 있습니다. 첫째, 함수의 이름을 알지 못해도 어떤 함수가 어떤 식 으로든 목록을 변경하고 어떤 기능이 있는지 즉시 확인할 수 있습니다. const
표준 라이브러리에서 같은 기능, 데이터를 변경하지 않는 것, 그리고 당신이 그들과 함께 데이터를 사용할 수 없습니다. C는 컴파일러 const
함수에 전달하는 데이터에 적용되는 포인터 의 -ness 를 유지하려고 합니다. 따라서 데이터를 수행 할 때 데이터를 수행하는 것과 비교를 수행 할 때 실수로 두 목록을 수행 할 수 있습니다. ;)
컴파일러는 변수가 변경되지 않는다는 것을 크게 최적화 할 수 있습니다. 변수를 메모리에 저장하는 대신 실행 가능한 opcode에 직접 기록합니다.
예 : 당신은 a와 b를 가지고 거기에 추가하고 a + b를 만듭니다. a를 const이고 값 3으로 선언하면 프로그램은 대신 3 + b를 만들어 a 값을 검색 할 필요가 없기 때문에 메모리와 사이클을 절약합니다.
문제는 컴파일러가 변수가 계속 지 여부를 미리 알 수있는 것입니다. 100 % 확실하지 않은 모든 코드를 분석하고 변수를 수정했는지 확인할 수 있습니다.
키워드 const
는 팀 및 장기 프로젝트에 매우 유용합니다. 몇 가지 예를 들어 보겠습니다 const
. 키워드의 가치를 설명해야 합니다.
이제 추가 프로젝트에 사용할 lib를 만들고 있다고 가정 해 보겠습니다. 따라서 오늘 작성된 코드는 몇 년 후에 신뢰할 수 있어야한다는 것을 의미합니다.이 기간 동안에는 어떤 변수를 수정해서는 안되는지 잊어 버릴 것입니다 (동료들은 수정할 수있는 것과 수정할 수없는 것을조차 모릅니다). 이 짧은 예제는 const
.
마감일이 다가오고 여전히 모든 기능에 대한 주석이 작동하지 않는 많은 항목이있을 때 주석에 대해 이야기하는 것은 시간 낭비 일 것입니다. 그러나 어떤 경우에는 주석이 필수입니다. 첫 번째 문제 (마감)로 인해 주석은 대부분 쓸모 없지만 중요한 주석도 건너 뛰기 때문에 읽지 못할 수 있습니다. 따라서 const
컴파일 오류를 제공하고 문제를 지적한 다음 많은 주석을 쓰고 읽는 키워드 를 사용하는 것이 좋습니다 .
IMO가 신념을 기반으로하기 때문에 이것은 어려운 질문입니다. 이러한 신념 중 하나는 코드를 더 추가하기 만하면 어떤 종류의 변경으로부터 코드를 보호 할 수 있다는 것입니다. 물론 모든 것을 확인하기 위해 컴파일러에서 추가 코드를 사용하는 것은 괜찮습니다.
항상 옳은 것은 아니라고 생각합니다. 자신이나 개발 팀이 키워드를 추가하는 것만으로도 코드를 보호 할 수는 없습니다. 사실 const, public, private, protected, internal, int, float가없는 많은 언어가 있습니다. 이중 키워드라고해서 좋은 언어가 아니라는 의미는 아닙니다.
일부 코드 패턴에서도 똑같은 일이 발생합니다. 사람들이 싱글 톤에 대해 토론하는 데 왜 그렇게 많은 시간을 낭비합니까? 단 하나의 인스턴스 만 갖고 싶다면 단 하나의 인스턴스 만 생성하면됩니다. 그게 전부입니다. 같은 사고 방식이 도처에 있습니다. 10 년 전에 게시 된 방어 프로그래밍 기사를 살펴보십시오. 다시 한 번 코드로 코드를 보호하는 아이디어입니다.
어느 시점에서 개발자의 손 또는 컴파일러의 책임을 어디에서 설정할 것인지 결정해야합니다. 그러나 컴파일러 나 다른 도구는 개발자에 대해 코드를 저장할 수 없으므로 많은 키워드가 쓸모가 없거나 다른 개발자에게 무언가를 전달하는 방법 일뿐입니다.
상수 변수를 사용하면 더 읽기 쉬운 코드를 작성할 수 있습니다.
const
거의 모든 언어에서 가장 많이 사용되는 것은 이름을 사용하여 상수 값을 참조 할 수 있도록하는 것이므로, 유창한 언어를 사용하여 다른 사람에게이 이름이 무엇을 의미하는지 코드에 주석을 퍼 뜨리고 시간과 노력을 절약 할 필요없이 알릴 수 있습니다. 독자로부터 매개 변수 유형과 매개 변수의 특성을 알 수 있습니다. 물론 상수 값이 코드 전체에서 재사용되는 경우에도 이점이 있습니다. 다음과 같은 코드는 더 읽기 쉽습니다.
processPages(LETTER_PAPER_WIDTH, LETTER_PAPER_HEIGHT);
...이것보다:
processPages(215.9, 279.4); // 8.5 x 11 Inches in millimeters for Letter Papers
위의 예에서 각 매개 변수가 무엇인지, 그 단위 및 값을 해석하는 유형을 이해해야하며, 이와 같은 중복 주석 (코딩 된 내용을 재생하는 주석)이 있기 때문에 주석에 대해 유효성을 검사해야합니다. 신뢰할 수 있고 유용한 댓글이 아닙니다 (Clean Code : http://goo.gl/5EyY의 Robert Martin에 따르면 나쁜 댓글입니다 ).
전체 프로젝트에서 동일한 상수를 여러 번 사용하고 모든 위치에서 하드 코딩하는 시나리오를 고려하십시오. 이제 갑자기 상수 값을 다른 값으로 변경해야하므로 모든 위치에서 변경하는 것이 바쁠 것입니다.
그래서 나는 당신의 코드를 더 유지하기 쉽게 만드는 것이 그 이유 중 하나라고 생각합니다.
'ProgramingTip' 카테고리의 다른 글
Swift에서 shouldChangeCharactersInRange가 어떻게 작동합니까? (0) | 2020.11.09 |
---|---|
둘 다 null 일 수있는 값을 비교하는 방법은 T-SQL입니다. (0) | 2020.11.09 |
유용한 Eclipse 기능? (0) | 2020.11.09 |
배열에서 가장 긴 찾기 찾기 (0) | 2020.11.09 |
삼항 연산자? : vs if… else (0) | 2020.11.09 |