programing

C와 자바의 논리적 차이

telebox 2023. 10. 14. 10:03
반응형

C와 자바의 논리적 차이

C에서 이 코드를 컴파일하고 실행합니다.

#include <stdio.h>

int main()
{
  int a[] = {10, 20, 30, 40, 50};
  int index = 2;
  int i;

  a[index++] = index = index + 2;
  for(i = 0; i <= 4; i++)
    printf("%d\n", a[i]);
}

출력 :10 20 4 40 50

자바에서도 동일한 논리를 사용할 수 있습니다.

class Check
{

  public static void main(String[] ar)
  {
    int a[] = {10, 20, 30, 40, 50};
    int index = 2;

    a[index++] = index = index + 2;
    for(int i = 0; i <= 4; i++)
      System.out.println(a[i]);
  }
}

출력 :10 20 5 40 50

두 언어에 출력 차이가 있는 이유는 무엇인가요, 출력은 이해할 수 있습니다.Java하지만 나는 출력을 이해할 수 없습니다.C

한가지 더, 접두사를 붙이면++교환원, 두 언어에서 동일한 결과가 나옵니다. 왜죠?

그 이유는a[index++] = index = index + 2;C에서 정의되지 않은 동작을 호출합니다.이것 좀 보세요.

링크에서:

두 번째 문장은 다음과 같이 말합니다. 만약 어떤 물체가 완전한 식 안에서 쓰여질 경우, 같은 식 안에서 그것에 대한 모든 접근은 쓰여질 값의 계산에 직접적으로 관여해야 합니다.이 규칙은 법적 표현을 수정하기 전에 액세스 권한이 표시될 수 있는 표현으로 효과적으로 제한합니다.예를 들어, i의 액세스는 i의 최종 값을 결정하는 데 사용되기 때문에 이전 대기 i = i + 1이 허용됩니다.예는

 a[i] = i++

i의 액세스 중 하나(a[i]에 있는 액세스)는 i에 저장되는 값(i++에서 발생) 아무 관련이 없기 때문에 허용되지 않습니다. 따라서 액세스가 증가된 값이 저장되기 전이나 후에 발생해야 하는지 컴파일러의 액세스를 정의할 좋은 방법이 없습니다.이를 정의할 수 있는 좋은 방법이 없으므로 표준은 이를 정의하지 않으며 휴대용 프로그램은 단순히 이러한 구성을 사용해서는 안 된다고 선언합니다.와 유사합니다.a[i++]=i(UB를 호출하는) 당신의 식 또한 UB를 호출합니다.

당신의 표정도 비슷한 행동을 하고 있습니다.

동작이 잘 정의되어 있습니다.Java.

언급URL : https://stackoverflow.com/questions/2028464/logic-differences-in-c-and-java

반응형