모든 인수 평가됩니다. 주문이 정의되지 않았습니다 (표준에 따라). 그러나 C/C++의 모든 구현은 함수 인수를 에서 오른쪽으로까지 평가합니다. EDIT : CLang은 예외입니다 (아래 주석 참조).
오른쪽에서 왼쪽으로의 평가 순서가 매우 오래되었다고 생각합니다 (첫 번째 C 컴파일러 이후). C++이 개발되기 전에 확실하게 C++의 대부분의 구현은 초기 C++ 구현이 단순히 C로 변환되었으므로 동일한 평가 순서를 유지합니다.
오른쪽에서 왼쪽으로 함수 인수를 평가하는 몇 가지 기술적 인 이유가 있습니다. 스택 아키텍처에서 인수는 일반적으로 스택에 푸시됩니다. C/C++에서는 실제로 지정한 것보다 많은 인수를 가진 함수를 호출 할 수 있습니다. 추가 인수는 무시됩니다. 인수가 왼쪽에서 오른쪽으로 평가되고 왼쪽에서 오른쪽으로 밀어 넣으면 스택 포인터 바로 아래의 스택 슬롯에 마지막 인수가 저장되며 함수가 특정 인수의 오프셋에서 가져올 방법이 없습니다 (실제로 전달되는 인수의 개수는 호출자에 따라 다르므로).
오른쪽에서 왼쪽으로 밀어 넣기 순서에서 스택 포인터 바로 아래의 스택 슬롯은 항상 첫 번째 인수를 보유하고 다음 슬롯은 두 번째 인수를 보유합니다. 인수 오프셋은 항상 함수에 대해 결정적입니다 라이브러리라고 불리는 곳과는 별도로 라이브러리의 다른 곳에서 쓰고 컴파일 할 수 있습니다.
이제 오른쪽에서 왼쪽으로의 밀어 넣기 순서는 오른쪽에서 왼쪽으로의 평가 순서를 지정하지 않지만 초기 컴파일러에서는 메모리가 부족합니다. 오른쪽에서 왼쪽 평가 순서에서는 동일한 스택을 사용할 수 있습니다 (본질적으로 인수를 평가 한 후에 표현식이나 함수 호출이 될 수 있습니다!) - 반환 값은 이미 올바른 위치에 있습니다. 스택). 왼쪽에서 오른쪽으로 평가할 때는 인수 값을 별도로 저장하고 역순으로 스택에 푸시해야합니다.
다른 컴파일러로 직접 시도해보십시오. – strager
C++의 하위 집합에 대한 인터프리터를 구현하는 동안 동일한 질문을 던졌습니다. 휴. –
'foo (i ++, i ++)'는 정의되지 않은 동작을 호출합니다. 왜냐하면'i'는 하나 이상의 시퀀스 포인트를 개입시키지 않고 하나 이상 증가하기 때문입니다. – Nawaz