C가 포인터에 별표를 사용하는 이유는 무엇입니까? [닫은]


21

방금 C에 대해 배우고 있습니다.

제작자가 *실제로 포인터 ( ) 처럼 보이는 심볼이 아니라 별표 ( )를 포인터의 심볼로 선택한 것이 이상합니다 ->.

역 참조 및 함수 포인터가 어떻게 혼동 될 수 있는지 고려할 때 별표를 사용하는 역사적 또는 실제적인 이유가 있습니까?


10
참고 ->참조 취소 조작으로 C 언어로 사용되고 - 구조체의 필드를 액세스했을 때 struct_pointer->field,에 대해 짧다 (*struct_pointer).field.
amon

@ amon : structs역 참조 에만 적용 되며 나에게 이상하게 보입니다. 포인터 심볼 이죠? <-역 참조를 위해 왜 ( ) 하지 않습니까? 정말 이런 식으로 생각하는 유일한 사람입니까?
멍청이 Saibot

1
이 질문에서 언어 디자이너가 직접 답변 한 답변을 포함하여 두 가지 훌륭한 답변을 감안할 때, "의견 기반"으로 닫기를 정당화하기는 어렵습니다. 그러므로 나는 다시 열도록 지명되었습니다.
Jules

IMHO 파스칼 스타일이 좋습니다. ^회전 화살표를 사용하여 "지점"으로 읽 ->습니다. ^integer형식 선언의 경우 "포인터를 정수로", var^의미 를 나타내는 " 메모리 var를 가리킴"을 의미합니다 . 왼쪽에서 오른쪽으로 읽을 때 기호 위치는 C보다 논리적이며 항상 유형 뒤에 변수 이름 앞에 놓입니다. 파스칼 은 "var이 위치한 주소" 이기 때문에 @주소를 가져 오는 데 사용 합니다&@var
phuclv

답변:


59

C가 포인터에 별표를 사용하는 이유는 무엇입니까?

B 는 그랬기 때문에 간단합니다 .

메모리는 선형 배열이므로 셀의 값을이 배열의 인덱스로 해석 할 수 있으며 BCPL은이를 위해 연산자를 제공합니다. 원래 언어에서는 철자가 쓰이고 rv나중에 !B는 단항을 사용합니다 *. 따라서 p다른 셀의 인덱스 (또는 주소) 또는 포인터를 포함하는 셀인 경우, 지정된 셀 *p의 내용을 표현식의 값 또는 대입의 대상으로 나타냅니다.

에서 는 C 언어의 개발

그게 다야. 이 시점에서 문제는 "파이썬 3이 .왜 메소드를 호출하는 데 사용 하는가? 왜 그렇지 ->않습니까?" 글쎄 ... 파이썬 2가 .메소드를 호출하는 데 사용 하기 때문 입니다.

언어가 전혀 존재하지 않는 경우는 거의 없습니다. 그것은 영향을 미쳤으며 이전에 있었던 것에 기초합니다.


그렇다면 B는 왜 !이전 BCPL처럼 포인터를 거부하는 데 사용 하지 않았습니까?

BCPL은 약간 장황했습니다. &&또는 ||BCPL 대신 logand및을 사용했습니다 logor. 대부분의 키보드의 din't이 있기 때문이었다 또는 키와 동일하지 실제로 말씀했다 NEQV(참조 매뉴얼 BCPL 참조 ).

B는 프로그래머가 상당히 자주 수행했던 모든 논리 연산자에 대한 긴 단어가 아닌 구문을 강화하기 위해 부분적으로 영감을 얻은 것으로 보입니다. 따라서 !역 참조를 위해되었다 *너무 !논리적 부정에 사용될 수 있습니다. 단항 *연산자와 이항 *연산자 (곱하기) 에는 차이가 있습니다.


글쎄, 같은 다른 옵션은 ->어떻습니까?

->필드 derefrences 주위 구문 설탕 찍은 struct_pointer->field(*struct_pointer).field

다른 옵션은 <-모호한 구문 분석을 생성 할 수 있습니다. 예를 들면 다음과 같습니다.

 foo <- bar

다음과 같이 읽습니다.

(foo) <- (bar)

또는

(foo) < (-bar)

이항 연산자와 다른 단항 연산자로 구성된 단항 연산자를 만드는 것은 두 번째 단항 연산자가 다른 식의 접두사 일 수 있으므로 문제가있을 수 있습니다.

또한 항목을 자주 입력하는 것을 최소화하는 것이 중요합니다. 나는 다음과 같이 쓰는 것을 싫어 한다.

int main(int argc, char->-> argv, char->-> envp)

이것도 읽기 어렵습니다.

다른 문자가 가능했을 수도 있습니다 ( Objective C가 적합 할@ 때까지 사용되지 않았습니다 ). 다시 말하지만, 이것은 ' B가했기 때문에 C 사용'의 핵심으로갑니다 . 왜 B를 사용하지 않았 습니까? B는 모든 문자를 사용하지 않았습니다. 프로그램 이 없었으며 ( cpp 비교 ) B에서 다른 문자를 사용할 수있었습니다 (예 : cpp에서 나중에 사용한 문자 ).*@bpp#

내가 왜 키 추측 위치에 대한 추측을 위험에 빠뜨릴 수 있습니다. B매뉴얼에서 :

이 바람직하다고 할 때 주소의 조작을 용이하게하기 위해, B 두 개의 단항 주소 연산자를 제공 *하고 &. &주소 연산자이므로 &x주소가 x있다고 가정합니다. *간접 연산자입니다. *x"x의 내용을 주소로 사용"을 의미합니다.

참고 &시프트 7과 *변화-8입니다. 서로에 대한 그들의 근접성은 프로그래머에게 그들이하는 일에 대한 힌트일지도 모른다. 그러나 그것은 단지 추측 일 뿐이다. 왜 그 선택을했는지 켄 톰슨에게 물어봐야 할 것 입니다.


그래서 거기 있습니다. B는 B이기 때문에 C는 그런 식입니다. B는 BCPL과는 다른 방식으로 바꾸고 싶었 기 때문에 그런 식입니다.


2
... 굉장하다! 이것은 @MichaelT의 훌륭한 답변입니다! 당신은 나에게 역사적인 이유와 실제적인 이유, 심지어 내가 이해하지 못했지만 조사 할 수있는 것들을 보여주었습니다. 고맙습니다. +1
멍청한 놈 사이 보트

@NoobSaibot 캐릭터의 선택은 운영자가 postpend 연산자가 아닌 prepend라는 사실만큼 중요하지 않습니다. 이를 위해서는 많은 양의 여분의 parens이 필요합니다 (-> syntaxactic sugar가 도움이되지만). 숙련 된 C ++ 프로그래머조차도 어리석지 만 버그를 일으킬 수 있습니다.
Trixie Wolf

1
C가 거의 모든 Ascii 문장 부호 문자를 사용한다고 언급했을 수도 있습니다. 여분이 많지 않았습니다. @다른 가능성이 있었을 것 같아요 .
david.pfx 1

1
@ david.pfx 나는 그것을 확장했습니다 -C 가 아니었지만 그 선택을 한 것은 ... B였습니다. 그리고 글쎄, 나는 왜 (키보드 근접 &*)에 대해 추측했습니다 . B도 사용하지 않았기 #때문에 주변에 여분의 여분이 더있었습니다 ... 또한 있습니다 $.

1
@ david.pfx 내가 찾은 B 튜토리얼 은 BW Kernighan이 작성했습니다. 불행히도 Dennis Ritchie 는 더 이상 (11 년 10 월에 세상을 떠난) 질문을 할 수 없지만 Kernighan은 여전히 ​​Princeton CS 부서의 교수로 남아 있습니다. Ken Thompson (B의 다른 제작자)은 Google에서 일하고 있습니다. 일부 키보드 (일반 키로 생각할 수있는 C의 3 가지 그래프로 표시)에 문제가있을 수 있습니다. '@'인지 확실하지 않습니다.)

55

만약이 학생이 질문을 받았다 &그리고 *그들이 키보드에서 서로 옆에 있었기 때문에 선택되었다 (뭔가 내가 전에 발견 적이 없었다). 많은 인터넷 검색으로 나를 B 및 BCPL 설명서 와이 스레드로 안내했습니다. 그러나 나는 많은 것을 찾지 못했습니다. *B 에는 많은 이유가있는 것처럼 보였지만에 대한 내용 을 찾을 수 없었습니다 &.

@MichaelT의 제안에 따라 Ken Thompson에게 물었습니다.

보낸 사람 : Ken Thompson <ken@google.com>

키보드 근처 : 아니요.
c에서 복사 된 c이므로 &와 *는 동일합니다.
b는 이전 언어에서 얻었습니다-일부 어셈블리,
bcpl 및 pl / 1이라고 생각합니다.
이름 (앰퍼샌드)
이 "주소"처럼 들리 므로 &를 사용했다고 생각합니다 . b는
텔레타이프 모델 33 텔레타이프 와 함께 작동하도록 설계되었습니다 . (5 비트 보드-코드)
기호 사용이 제한되었습니다.


19
Ken Thompson에게 연락하여 다시보고 해 주신 +1
stakx 2019
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.