int x = 0;
x^=x || x++ || ++x;
и, наконец, ответ для x равен 3. Как анализировать это выражение? немного запутался в этом. Большое спасибо.
int x = 0;
x^=x || x++ || ++x;
и, наконец, ответ для x равен 3. Как анализировать это выражение? немного запутался в этом. Большое спасибо.
Это неопределенное поведение. Результат мог быть любым. Это связано с тем, что между ++x
и x ^=
нет точки последовательности, поэтому нет никакой гарантии, что будет "сделано" в первую очередь.
^=
.
- person Oliver Charlesworth; 27.01.2011
||
всегда является точкой последовательности. Единственные две модификации, вызывающие UB, - это последний ++x
и x^=
.
- person aschepler; 27.01.2011
Это неопределенное поведение - так что вы можете получить любой ответ, какой захотите.
Как уже отмечали другие, это неопределенное поведение. Но почему?
При программировании на C существует внутренняя разница между оператором и выражением. Оценка выражения должна дать вам те же наблюдаемые результаты в любом случае (например, (x + 5) + 2 совпадает с x + (5 + 2)). С другой стороны, операторы используются для определения последовательности побочных эффектов, то есть обычно приводят, скажем, к записи в какую-либо область памяти.
Учитывая вышеизложенное, выражения можно безопасно «вкладывать» в операторы, тогда как вложение операторов в выражения - нет. Под «безопасным» я подразумеваю «никаких удивительных результатов».
В вашем примере у нас есть
x^=x || x++ || ++x;
В каком порядке должна проводиться оценка? Поскольку || работает с выражениями, не имеет значения, идем ли мы (x || x ++) || ++ x или x || (x ++ || ++ x) или даже ++ x || (х || х ++). Однако, поскольку x ++ и ++ x являются операторами (даже несмотря на то, что C позволяет использовать их как выражения), мы не можем использовать алгебраические рассуждения. Итак, вам нужно будет явно выразить порядок операций, написав несколько операторов.
XOR 0 с 0 равно 0. Тогда ++ дважды равно 2. Тем не менее, как указано в других ответах, точки последовательности нет. Так что на выходе может быть что угодно.
0,0->0, 0,1->1, 1,0->1, 1,1->0
. Это не лучшее начало для ответа :-)
- person paxdiablo; 27.01.2011