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과는 다른 방식으로 바꾸고 싶었 기 때문에 그런 식입니다.
->
참조 취소 조작으로 C 언어로 사용되고 - 구조체의 필드를 액세스했을 때struct_pointer->field
,에 대해 짧다(*struct_pointer).field
.