C # 8 어레이 슬라이싱 기능의 새 hat-operator 인덱스가 0에서 시작하지 않는 이유는 무엇입니까?


156

C # 8.0은 편리한 배열 배열 방법을 소개합니다 ( 공식 C # 8.0 블로그 게시물 참조) .

배열의 마지막 요소에 액세스하는 구문은 다음과 같습니다.

int value[] = { 10, 11, 12, 13 };

int a = value[^1]; // 13
int b = value[^2]; // 12

요소에 뒤로 액세스하기위한 인덱싱이 0이 아닌 1에서 시작하는 이유가 궁금합니다. 이에 대한 기술적 이유가 있습니까?


11
C ++ 범위도 있습니다 [beginInclusive, endExclusive). 일반적인 규칙입니다.
bommelding 2019 년

3
@Sinatr : 해당 블로그 게시물을 기반으로 value[0..^0], 끝 인덱스가 배타적이기 때문에 모든 것을 반환하는 구문은 다음 과 같습니다 (대부분의 다른 언어도 작동 함). 또한 편리하게 value[^i..^0]마지막 i항목을 제공합니다 .
BlueRaja-대니 Pflughoeft

1
@ bommelding : C ++ rbegin()은 그 개념에 다소 동의하지 않습니다. 해당 범위를 벗어난 첫 번째 항목은 끝이 아닙니다. ;-)
DevSolar

1
오, 멋지다, 이것은 파이썬에서 음의 인덱싱과 같다 :value[-1] # 13
cs95

1
@coldspeed 그리고 루비에서는 파이썬과 동일합니다. 나는 그들이 둘 다 Perl에서이 협약을 빌린 것 같아요.
Wayne Conrad

답변:


170

공식 답변

가시성을 높이기 위해 Mads TorgersenC # 8 블로그 게시물 에서이 디자인 결정에 대해 설명합니다 .

우리는 시작부터 끝까지의 산술에 관해서 파이썬을 따르기로 결정했습니다. 0 첫 번째 요소 (항상 ^0 그러함 )와 "길이"요소, 즉 끝에서 오른쪽 요소를 지정합니다  . 이렇게하면 요소의 위치와 시작 위치가 길이와 같은 간단한 관계를 얻을 수 있습니다. x 인은  ^x 당신이 수학을 직접 수행했던 경우는 길이에서 제외했을 것입니다.

-새 모자 ( ^) 연산자 대신 빼기 ( )를 사용하지 않습니까? 이것은 주로 범위와 관련이 있습니다. 파이썬과 대부분의 업계와 마찬가지로, 우리는 범위가 처음에는 포함되고 끝에는 독점적이기를 원합니다. 범위가 끝까지 가야한다고 말하는 지수는 무엇입니까? C #에서는 대답이 간단합니다.  끝에서 끝까지 x..^0갑니다  x. 파이썬에는 당신이 줄 수있는 명시적인 인덱스 -0가 없습니다 : 0첫번째 요소와 같기 때문에 작동하지 않습니다 ! 따라서 파이썬에서는 끝까지가는 범위를 나타 내기 위해 끝 색인을 완전히 꺼 두어야합니다 x... 범위의 끝이 계산되면에 나오는 경우를 대비하여 특별한 논리가 있어야합니다 0. 마찬가지로 x..-y, 어디y계산되어 나왔습니다 0. 이것은 일반적인 성 가시고 버그의 원인입니다.

마지막으로, 인덱스와 범위는 .NET / C #의 첫 번째 클래스 유형입니다. 그들의 행동은 그들이 인덱서에 적용되거나 심지어 인덱서에 사용되는 것에 묶여 있지 않습니다. 당신은 완전히 지수와 소요 다른 소요 자신의 인덱서를 정의 할 수 있습니다 Range- 우리는 예를 들어, 그러한 인덱서를 추가하는 겁니다  Span. 그러나 예를 들어 범위를 취하는 메소드를 가질 수도 있습니다.

내 대답

나는 이것이 우리가 사용하는 고전적인 구문과 일치한다고 생각합니다.

value[^1] == value[value.Length - 1]

0을 사용하면 두 구문을 나란히 사용할 때 혼동됩니다. 이런 식으로 인지 부하 가 낮습니다 .

파이썬과 같은 다른 언어도 같은 규칙을 사용합니다.


13
Mads 의견에 대한 사소한 수정 : 파이썬에서 최종 색인을 완전히 벗어날 필요는 없습니다 . None숫자 대신 사용할 수 있습니다 : [0,1,2,3,4][2:None] == [2,3,4]. 그러나 네, 정수를 끝 인덱스로 사용할 수는 없습니다 (길이를 계산하지 않고).
Giacomo Alzetta

4
잠깐만 .. 왜 x..그래? 그것은 괜찮아 보이고 파이썬 [3:]구문에 문제가 없었습니다 .
mowwwalker

8
@ mowwwalker-견적에 이미 포함되어 있지 않습니까? "그래서 파이썬에서 ... 범위의 끝이 계산되면 0이 나오는 경우 특별한 논리를 기억해야합니다"
Damien_The_Unbeliever

3
@mowwwalker Mads 의견은 어떤 방식으로 계산 되었기 때문에 인덱스 값이 무엇인지 알지 못하는 경우에 관한 것입니다. 그들은 당신이 endIndex음의 인덱스 (즉, 끝에서 인덱스) 로 계산하려는 0경우 그 경우 올바른 방식으로 작동하지 않기 때문에 음수와 양수 사이의 불연속성을 가질 것이라고 말합니다. 내가 지적하면 교체해야 0의해 None그합니다. 이것은 코드가 seq[startIndex:endIndex or None]예를 들어 보일 것임을 의미합니다 . 이 or None경우 생략한다 endIndex긍정적 인 것으로 예상된다.
Giacomo Alzetta

5
그들이 -0으로 파이썬의 실수를 반복하지 않는 것을 보는 것이 좋습니다. 이 특별한 경우를 다루는 것은 매우 번거롭고 잊을 수없는 방법입니다.
user2357112는 Monica
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.