Продължавам да разчитам на недефинираните правила за поведение и да прочета следното:
Недефинирано поведение и точки на последователност
Защо е f (i = -1, i = -1) недефинирано поведение?
Защо `x -> 0` не е недефинирано поведение, докато` x = x - `е?
И В C ++ 11, "i + = ++ i + 1" показва недефинирано поведение?
И завърши с три въпроса:
- Прави ли недефинираните правила за поведение на формулярите
i=i++
важи за неинтегрални типове? (Израза трябва да превежда наi.operator(i.operator++(i))
, и тъй като всяко извикване на функция е точка на последователност тя трябва да бъде добре дефинирана, ако разбирам правилно правилно) - Защо е
f(i=-1, i=-1)
недефинирано поведение в комбинация с "Резултатът от операцията по задаване е стойността, съхранена в левия операнд след извършване на задаването, резултатът е lvalue" (ref) [https://stackoverflow.com/a/4190054/258418]? (Разбирам, че стойността на i е неопределена след това, но функционалният коефициент трябва да бъде оценен катоf(-1, -1)
ако разбирам стандарта правилно. - Кои видове изрази стават сигурни с c ++ 11/14 / 1z, само preincrement / predecrement в простата задача (не
op=
)?
Отговори:
2 за отговор № 1Забрави за f (i = -1, i = -1)
, Да приемем, че имате две указатели int* p
и int* q
, и ви се обаждате
f (*p = 1, *q = 2)
Това е недефинирано поведение, ако p == q. Ако не искате да бъде недефинирано поведение, как бихте определили поведението в случая p == q? (Защото ако не ви харесва, че това е неопределено, трябва да го определите по някакъв начин). Освен това, бихте ли приели дефиниция на поведението, което означава, че 99,999% от кода може да се движат малко по-бавно, за да спаси някой явно идиотичен код?
След това идва случаят
f (*p = -1, *q = -1)
Така се присвоява същата стойност. Ако искате това да бъде определено поведение, но не и да се задават различни стойности, как на земята ви предлагаме да поставите това в разумно правило?