В C++ 03.
void main(void)
{
int x,y,z;
x=y=z=1; // Seq1 at ;
z = x && y && ++z;//is this fine? // Seq2 at ;
}
NB: Обратите внимание, что есть точки последовательности у оператора & & но те не имеют значения в данном примере.
Отлично !. В общем, может быть или нет. Зависит от значений x и y. В вашем конкретном случае это не нормально. Этот код может иметь что-то, называемое undefined behavior.
Если г ++ оценивается (как в вашем примере, потому что х и у 1), то скалярная переменная «г» изменяется более чем один раз в выражении между двумя последовательно указывает Seq1 и seq2 (смотри ниже). Важно отметить, что оператор присваивания не вводит никакой точки последовательности.
$ 5/4- «За исключением особо оговоренных случаев, порядок оценки операндов отдельных операторов и подвыражениям отдельных выражений, и порядок, в котором побочные эффекты имеют место, это unspecified.53) Между предыдущей и следующей точкой последовательности скаляр объект должен иметь хранимую в нем величину модифицированного не более одного раза в вычисления выражения. Кроме того, предшествующее значение должно быть доступ только к де укажите значение для хранения. Требования настоящего пункта должны быть выполнены для каждого допустимого порядка подвыражений полного выражения; иначе поведение не определено.»
В C++ 0x
будет обновлять один раз я сам понимаю подробности обсуждения ссылается @litb.На данный момент я просто удаляю его
В C++ 0X однако, как я понимаю, нет понятия точек последовательности. Это выражение прекрасно и не вызывает неопределенное поведение. Это связано с тем, что эффект ++ на 'z' секвенирован перед побочным эффектом присваивания на 'z'.
$ 1,9/15- «За исключением особо оговоренных случаев, оценки операндами отдельных операторов и подвыражений отдельных выражений unsequenced [Примечание:. В выражении , который оценивается более чем один раз во время выполнение программы, unsequenced и виртуализированные неопределенна оценка его подвыражений не нужно проводить последовательно в разных оценках. -end примечание] Значение расчетов операндами оператора являются , упорядоченные до вычисления значения результата оператора. Если побочного эффект от скалярного объекта unsequenced по отношению к любому другим побочного эффекту на тот же скалярном объект или вычисление значения, используя значение одного и тот же скалярного объекта, поведения не определенно.
$ 3,9/9 - «Арифметические типов (3.9.1), перечислимых типов, типы указателей, указателя на типы членов (3.9.2), станд :: nullptr_t и резюме квалифицированных версии этих типы (3.9.3) - это , которые в совокупности называются скалярными типами ».
Обратите внимание, что в выражении 'z = z ++;' где z - скалярная переменная, побочные эффекты на «z» из-за оператора присваивания и постфиксного оператора ++ не подвержены последовательности (ни одна из них не секвенирована перед другой).
Благодаря @Prasoon для придания ценный вклад уточнить этот пост от оригинальной версии
возвращаемый тип 'главного()' должен быть 'int' в C и в C++. –