나는 쉼표로 두 인스턴스가 분리되어 있기 때문에 유효하다고 생각합니다. (일반적인 할당은 아니지만) 확신 할 수없고 검색은이 두 가지 특정 상황에 대해 어떤 것도 제기하지 않습니다.같은 줄에서 변수를 사용할 때 사전 증가 연산자
두 경우 모두 변수를 두 개의 병렬 배열에 대한 인덱스로 사용하고있었습니다.
int a[3] = {10, 20, 30};
int b[3] = {20, 40, 60};
상황 1 : 배열
struct testStruct {
int t1;
int t2;
};
int i = 0;
testStruct test = {a[++i], b[i]}
최종 라인
예상 결과의 구조체를 초기화 : test = {20, 40}
상황 # 2 : 함수로서 배열에서 특정 값 전달 args
void testFunc(int t1, int t2) {
// do stuff
}
int i = 0;
test(a[++i], b[i]);
최종 결과 예상 결과 : test(20, 40)
유효한 코드인가요? 그리고 그렇다면 모든 컴파일러에서 유효합니까?
결과가 예상대로입니까? 그렇다면, 배열 때문이거나 쉼표로 인한 것입니까?
감사합니다.
첫번째 코드 니펫
상황 하나 콤마 연산자 아니지만 시퀀스 지점이 참조 [정의되지 않은 동작이 사전에 C 초기화 목록 내의 동일 변수의 여러 돌연변이인가 ++ 11] (http://stackoverflow.com/questions/19881803/are-multiple-mutations-of-the-same-variable-within-initializer-lists-undefined-b) 및 [이니셜 라이저 내의 여러 변형은 정의되지 않은 동작입니까? ] (http://stackoverflow.com/questions/14442894/are-multiple-mutations-within-initializer-lists-undefined-behavior) ... 상황 2는 쉼표 연산자가 아닌 정의되지 않은 동작입니다. –
링크를 가져 주셔서 감사합니다. 나는 그 용어를 검색하지 못했을 것입니다. 적어도 첫 번째 인스턴스가 작동한다는 것을 알면 기쁩니다. – Simca
첫 번째 인스턴스 인 pre C++ 11에서는 평가 순서가 지정되어 있지 않음을 알고 있어야합니다. 나는 까다로운 코드에 대해 조언 할 것이고, {a [i], b [i + 1]} 등을 할 수 있고 이후에 'i'를 증가 시키면 표준의 이상한 모서리에 대해 걱정할 필요가 없을 것이다. –