programing

VB.net 에 증분 연산자가 없습니다.

i4 2023. 5. 26. 20:44
반응형

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 += 1count가 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를 들어, , 를낳다니습라는 가 나옵니다.4VB에서는 그럴 수 없는 반면, 진술로서 독립적일 수 있습니다.

"VB에서 사전 및 사후 증분 연산자를 사용할 수 없는 이유는 무엇입니까?"에 대한 간단한 답변

count++says, 먼저 값을 반환합니다.count 후 증분count을 (으)로 .count).
이 경우 증분 값이 사용되지 않습니다(증분 전 값이 사용됨).앞서 언급했듯이 VB 컴파일러에서는 작업 값을 사용하거나 할당해야 합니다.

++countsays, 번째 증분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

반응형