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
'programing' 카테고리의 다른 글
개체에서 속성을 불변으로 제거 (0) | 2023.10.14 |
---|---|
AngularJsng 테이블 고정 헤더 (0) | 2023.10.14 |
단위 테스트 클릭 이벤트(Angular) (0) | 2023.10.09 |
jQuery에서 html 요소를 만드는 가장 명확한 방법 (0) | 2023.10.09 |
C# 문자열의 여러 문자 바꾸기 (0) | 2023.10.09 |