VB.net 에 증분 연산자가 없습니다.
vb 에 이며 C를 VB 로 하는 동안 이 했습니다. vb.net 및할 수 없다는 , vb.net 의 VB.net C#과 같은 할 수 . 저는 vb.net (++ 및 --)에서 증분 연산자를 사용할 수 없다는 것을 깨달았지만, 저는 다음과 같은 작업을 수행할 수 있었습니다.cnt +=1
제가 조금 조사해보니 에릭의 게시물을 발견했지만, 그것에 대해 완전히 이해할 수 없었습니다.그는 VB에서 진술이 단순한 표현일 수 없다고 언급했습니다.그게 정말 어떻게 들어맞는지 모르겠어요.
가 왜 과 같은 하지 않는지 수 (가 왜 C#과 같은 방식으로 작동하는지에 .)==
비교를 위해 C#으로 표시)
저는 언어 디자이너들이 비주얼 베이직을 디자인할 때 단순히 베이직이 C보다 더 나은 기준선이라고 생각했다고 말하고 싶습니다.다음의 계통을 따를 수 있습니다.C
앞에서, (그고리아, 까,아,BCPL
부터 )까지C++
,Java
그리고.C#
.
그VB
혈통은 원래의 것에서 옵니다.BASIC
다트머스에서 왔습니다.Fortran
그리고 완전히 다른 짐승입니다.
다시 말해서, 무엇이 존경받는 사람으로 시작했는지는BASIC
:
LET I = I + 1
아마도 충분히 해킹되고 파괴되었을 것입니다 :-)
에릭의 게시물에 따르면,i++;
실제로는 그저 하나의 표현일 뿐입니다, 산출하는 것입니다.i
라는 부작용과 함께i
이 없는 함).i;
).
ㅠㅠㅠC
심지어 이런 노골적인 표현들을 허용합니다.42;
별 효과는 없지만 완벽하게 유효합니다.즉, 다음은 완전한 것입니다.C
프로그램:
int main (void) { 1; 2; 3; 4; 5; 6; 7; 8; 9; return 0; }
쓸모가 없습니다.0
마지막에).
BASIC
이것은 실제로 이루어지지 않았습니다, 왜냐하면BASIC
진술(어떤 일을 한 것)로 구성되었습니다.그렇기 때문에i += 1
(증가는문하문)i
, )는 괜찮아요.i++
(아무것도 하지 않는 표현은 단지 증가하는 부작용을 초래할 뿐입니다.i
아닙다니. 할 수 , 이 바로 그런입니다.당신은 그것이 단지 의미론적으로 머리카락을 쪼개는 것이라고 주장할 수 있지만 그것은 단지 그런 것입니다.
당신은 작은 자비에 감사해야 합니다, 적어도 당신은 코볼을 상대할 필요가 없습니다.
ADD 1 TO DD_WS_I.
단지 디자이너들이 생각했기 때문에.i++
당신이 가지고 있을 때는 불필요합니다.i += 1
.
For
루프는 둘 다 필요하지 않기 때문에 아무것도 잃지 않습니다.
Visual Basic은 결국...왜 그것을 복잡하게 만드나요?
@paxdiablo가 말했듯이, VB(또는 조상 베이직)에서는 모든 것이 진술이었습니다.그리고 사실, 모든 진술은 키워드에 의해 소개되었습니다.
그래서 우리가 가지고 있던 변수를 할당하기 위해
LET x = x + 1
그리고 방법을 말하자면, 우리는.
CALL SomeMethod
VB는LET
그리고.CALL
완전히 중복되고 명확성을 추가하지 않기 때문에 (한 가지 특별한 상황을 제외하고) 최종적으로 삭제되었습니다.하지만 VB의 기본적인 어휘 문법은 그렇게 많이 바뀌지 않았습니다. 각 문장은 여전히 문장이어야 합니다. i++
함수 호출이나 할당이 없기 때문에 VB의 문이 아닙니다.
VB.NET의 첫 번째 버전에서는 C#과 같이 증가 전 연산자와 증가 후 연산자를 도입해야 하는지에 대한 논쟁이 있었습니다.이것을 하지 않기로 결정한 이유는 매우 단순합니다. 어쨌든 부작용을 표현에 사용하는 것은 권장되지 않습니다.그것은 보통 명확성을 해치게 합니다. C에서도 의서 C#합법적의 합법적인 사용이 합니다.i++
표현에서, 매우 드물고, 합법적인 사용.++i
더 희귀합니다(경우에 따라 명확성이 추가된다는 것을 부인하지는 않겠습니다).
대부분의 경우 사용할 수 있습니다.i += 1
그냥 좋아요 그리고 이것은 의도를 완벽하게 잘 표현합니다.
C++에서 상황은 근본적으로 다르다는 것에 주목하십시오. 왜냐하면 여기(C#에서는 그렇지 않지만!)에서는 그렇지 않기 때문입니다.i++
실제로 와 다른 의미를 가지고 있습니다.i += 1
오버로드로 (에서는 연산자 C#에서는 연산자 오버로드가 발생합니다.)++
오버로드할 수 없음).
VB에서 식과 문 사이의 차이의 예로, VB에서 다음은 컴파일러 오류를 생성합니다.count += 1
count
가 1로, 만표현전체가하로지전▁by.count += 1
결과를 반환하지 않으므로 매개 변수로 사용할 수 없습니다.
Dim count As Integer = 0
Console.WriteLine(count += 1) ' compiler error
당신은 대신 이것을 해야 합니다.
Dim count As Integer = 0
count += 1
Console.Writeline(count)
물론 사용할 때도 마찬가지입니다.+=
연산자를 입력합니다.
"VB에서, 진술은 단지 표현일 수 없다"는 것은 무엇을 의미합니까?
- VB 컴파일러를 사용하려면 일부 할당 또는 다른 작업에서 결과를 사용해야 합니다.
- 이로 인해 VB에서 할당 작업을 수행해도 결과가 생성되지 않습니다.만약 그랬다면 VB 컴파일러는 명령문으로 독립적으로 실행하는 것을 허용하지 않을 것입니다(컴파일러는 결과를 사용해야 합니다).
- 따라서 VB의 할당은 문으로 사용할 수 있지만 식으로는 사용할 수 없습니다.즉, 할당 문을 메서드에 대한 매개 변수 또는 중간 결과로 사용할 수 없습니다.
- C#에서 할당 작업은 값을 생성합니다.따라서 할당이 명령문으로 독립적으로 실행되기 위해 컴파일러는 모든 결과를 사용할 필요가 없습니다.
- C#의 필연적인 결과는 결과를 생성하는 다른 모든 연산이 문으로 독립적일 수 있다는 것입니다.
2 + 2
를 들어, , 를낳다니습라는 가 나옵니다.4
VB에서는 그럴 수 없는 반면, 진술로서 독립적일 수 있습니다.
"VB에서 사전 및 사후 증분 연산자를 사용할 수 없는 이유는 무엇입니까?"에 대한 간단한 답변
count++
says, 먼저 값을 반환합니다.count
그 후 증분count
을 (으)로 .count
).
이 경우 증분 값이 사용되지 않습니다(증분 전 값이 사용됨).앞서 언급했듯이 VB 컴파일러에서는 작업 값을 사용하거나 할당해야 합니다.
++count
says, 첫 번째 증분count
그런 다음 할당 값을 반환합니다.count
.
++1에 과 같습니다.count
식의 값으로 반환됩니다.앞에서 언급했듯이 VB의 할당은 결과를 생성하지 않습니다.
따라서 VB에서 이러한 연산자를 구현하는 데 심각한 문제가 발생할 수 있습니다.
은 다확장메복다니제됩을 복제합니다.++x
x++
--x
x--
Public Module INC_DEC
<Runtime.CompilerServices.Extension>
Public Function PreINC(ByRef x As Integer) As Integer
Return Interlocked.Increment(x)
End Function
<Runtime.CompilerServices.Extension>
Public Function PostINC(ByRef x As Integer) As Integer
Dim tmp = x
Interlocked.Increment(x)
Return tmp
End Function
<Runtime.CompilerServices.Extension>
Public Function PreDEC(ByRef x As Integer) As Integer
Return Interlocked.Decrement(x)
End Function
<Runtime.CompilerServices.Extension>
Public Function PostDEC(ByRef x As Integer) As Integer
Dim tmp = x
Interlocked.Decrement(x)
Return tmp
End Function
End Module
언급URL : https://stackoverflow.com/questions/6339442/no-increment-operator-in-vb-net
'programing' 카테고리의 다른 글
-ObjC 링커 플래그의 역할은 무엇입니까? (0) | 2023.05.26 |
---|---|
Windows Form 라디오 단추를 그룹화하는 방법 (0) | 2023.05.26 |
여러 개의 .gitignore가 눈살을 찌푸리고 있습니까? (0) | 2023.05.26 |
특정 리비전/변경 세트로 git 저장소를 복제하는 방법은 무엇입니까? (0) | 2023.05.26 |
이클립스 테마를 변경하려면 어떻게 해야 합니까? (0) | 2023.05.26 |