x시퀀스 포인트 사이에서 두 번 수정되기 때문에 정의되지 않습니다 . 표준은 정의되지 않았으므로 정의되어 있지 않습니다.
내가 알고있는 것
그런데 왜?
내 이해는 이것을 금지하면 컴파일러가 더 잘 최적화 할 수 있다는 것입니다. 이것은 C가 발명되었을 때 의미가 있었지만 이제는 약한 주장처럼 보입니다.
만약 우리가 오늘 C를 재발 명한다면, 우리는 이런 식으로할까요, 아니면 더 잘할 수 있습니까?
또는 더 깊은 문제가있어 그러한 표현에 대해 일관된 규칙을 정의하기 어렵 기 때문에 금지하는 것이 가장 좋습니다.
오늘 C를 재창조했다고 가정 해 봅시다 과 같은 표현에 대한 간단한 규칙을 제안하고 싶습니다 x=x++. 기존 규칙보다 잘 작동하는 것 같습니다.
기존 규칙 또는 다른 제안과 비교하여 제안 된 규칙에 대한 귀하의 의견을 듣고 싶습니다.
제안 된 규칙 :
- 시퀀스 포인트 사이에서 평가 순서는 지정되지 않습니다.
- 부작용은 즉시 발생합니다.
정의되지 않은 동작이 없습니다. 식은이 값 또는 그 값으로 평가되지만 하드 디스크를 포맷하지는 않습니다 (이상하게도 x=x++하드 디스크를 포맷 하는 구현은 본 적이 없습니다 ).
표현식 예
x=x++-잘 정의되어 있으며 변경되지 않습니다x.
먼저,x(x++평가 될 때 즉시) 증가한 다음 이전 값이에 저장됩니다x.x++ + ++x-x두 번 증가 하고로 평가됩니다2*x+2.
어느 쪽이든 먼저 평가할 수 있지만 결과는x + (x+2)(왼쪽부터) 또는(x+1) + (x+1)(오른쪽부터)입니다.x = x + (x=3)-지정되지 않은x경우x+3또는로 설정하십시오6.
오른쪽이 먼저 평가되면x+3입니다.x=3먼저 평가 되는 것도 가능합니다3+3. 두 경우 모두x=3할당x=3이 평가 될 때 즉시 할당 이 수행 되므로 저장된 값은 다른 할당으로 덮어 씁니다.x+=(x=3)-잘 정의되어 있고,x6으로 설정 됩니다.
위의 표현에 대한 축약 형이라고 주장 할 수 있습니다.
그러나 나는 두 부분 (읽기 , 평가 , 추가 및 새로운 값 저장)이 아니라+=이후x=3에 실행되어야 한다고 말하고 싶습니다 .xx=3
장점은 무엇입니까?
몇몇 의견은이 점을 지적했다.
필자는 x=x++정상적인 코드에서 와 같은 표현식을 사용해야 한다고 생각하지 않습니다 .
사실, 난 훨씬 더 엄격한보다 해요 - 나는 유일한 좋은 사용을 생각 x++로 x++;혼자.
그러나 언어 규칙은 가능한 한 단순해야한다고 생각합니다. 그렇지 않으면 프로그래머는 이해하지 못합니다. 시퀀스 포인트 사이에서 변수를 두 번 변경하는 것을 금지하는 규칙은 대부분의 프로그래머가 이해하지 못하는 규칙입니다.
매우 기본적인 규칙은 다음과 같습니다.
A가 유효하고 B가 유효하고 올바른 방식으로 결합되면 결과가 유효합니다.
x유효한 L- 값이고 x++유효한 표현이며 =L- 값과 표현식을 결합하는 유효한 방법이므로 어떻게 x=x++합법적이지 않습니까?
C 표준은 여기서 예외를 만들고이 예외는 규칙을 복잡하게합니다. stackoverflow.com 을 검색 하여이 예외가 사람들을 혼동하는 정도를 확인할 수 있습니다 .
그래서 나는 말합니다-이 혼란을 제거하십시오.
=== 답변 요약 ===
왜 그럴까요?
위의 섹션에서 설명하려고했습니다 .C 규칙을 간단하게 만들고 싶습니다.최적화 가능성 :
컴파일러에서 약간의 자유가 필요하지만 중요하다는 것을 확신시키는 것을 보지 못했습니다.
대부분의 최적화는 여전히 수행 할 수 있습니다. 예를 들어,a=3;b=5;표준에서 순서를 지정하더라도 순서를 바꿀 수 있습니다. 과 같은 표현식a=b[i++]은 여전히 유사하게 최적화 될 수 있습니다.기존 표준을 변경할 수 없습니다.
인정할 수 없습니다. 나는 실제로 표준과 컴파일러를 바꿀 수 있다고 생각하지 않았습니다. 나는 일이 다르게 이루어질 수 있는지 생각하고 싶었습니다.
x자신 에게 할당 할 점이별로 없으며 증분x을 원한다면x++;할당 할 필요가 없다고 말할 수 있습니다 . 나는 그것이 일어날 일을 기억하기가 어렵 기 때문에 그것을 정의 해서는 안된다고 말하고 싶습니다.