이 주제를 다음 주제의 속편으로 간주하십시오.
이전 기사
정의되지 않은 동작 및 시퀀스 포인트
이 재미 있고 복잡한 표현을 다시 살펴 보겠습니다 (이탤릭체 표현은 위의 주제 * smile *에서 가져온 것입니다).
i += ++i;
우리는 이것이 정의되지 않은 행동을 유발한다고 말합니다. 나는 이것을 말할 때 type of i
가 내장 유형 중 하나 라고 암시 적으로 가정한다고 가정합니다 .
의 유형 이 i
사용자 정의 유형 이면 어떻게 됩니까? 유형 Index
이이 게시물의 뒷부분에 정의되어 있다고 말합니다 (아래 참조). 여전히 정의되지 않은 동작을 호출합니까?
그렇다면 그 이유는 무엇입니까? 글을 쓰는 것과 같지 i.operator+=(i.operator++());
않거나 구문 적으로 더 간단하지 i.add(i.inc());
않습니까? 아니면 그들도 정의되지 않은 동작을 호출합니까?
아니라면 왜 안됩니까? 결국, 객체 i
는 연속 된 시퀀스 포인트 사이에서 두 번 수정 됩니다 . 경험상의 규칙을 기억하십시오. 표현식은 연속 된 "시퀀스 포인트 사이에서 객체의 값을 한 번만 수정할 수 있습니다 . i += ++i
표현식 인 경우 정의되지 않은 동작을 호출해야합니다. 그렇다면 해당 항목 i.operator+=(i.operator++());
과 i.add(i.inc());
정의되지 않은 동작을 호출해야합니다. 사실이 아닌 것 같습니다! (내가 이해하는 한)
또는, i += ++i
아닌 표현 으로 시작하려면? 그렇다면 그것은 무엇이며 표현 의 정의는 무엇 입니까?
식이고 동시에 동작 도 잘 정의되어 있으면 식과 관련된 시퀀스 포인트의 수가 식에 포함 된 피연산자 의 유형 에 따라 달라진다는 것을 의미합니다 . 내가 맞습니까 (일부라도)?
그런데이 표현은 어떻습니까?
//Consider two cases:
//1. If a is an array of a built-in type
//2. If a is user-defined type which overloads the subscript operator!
a[++i] = i; //Taken from the previous topic. But here type of `i` is Index.
당신은 당신의 응답에서도 이것을 고려해야합니다 (당신이 그 행동을 확실히 알고 있다면). :-)
이다
++++++i;
C ++ 03에서 잘 정의되어 있습니까? 결국 이것은 이것입니다.
((i.operator++()).operator++()).operator++();
class Index
{
int state;
public:
Index(int s) : state(s) {}
Index& operator++()
{
state++;
return *this;
}
Index& operator+=(const Index & index)
{
state+= index.state;
return *this;
}
operator int()
{
return state;
}
Index & add(const Index & index)
{
state += index.state;
return *this;
}
Index & inc()
{
state++;
return *this;
}
};