с, побитовое, логическое выражение - PullRequest
0 голосов
/ 27 января 2011
int x = 0;
x^=x || x++ || ++x;

и ответ для х, наконец, 3. Как проанализировать это выражение? немного запутался по этому поводу. Большое спасибо.

Ответы [ 4 ]

7 голосов
/ 27 января 2011

Это неопределенное поведение.Результатом может быть что угодно.Это связано с тем, что между ++x и x ^= нет последовательности , поэтому нет гарантии, что будет «сделано» первым.

2 голосов
/ 27 января 2011

Это неопределенное поведение - так что вы можете получить любой ответ, который захотите.

0 голосов
/ 27 января 2011

Как уже отмечали другие, это неопределенное поведение. Но почему?

При программировании на языке C существует существенная разница между оператором и выражением. Оценка выражения должна давать вам те же наблюдаемые результаты в любом случае (например, (x + 5) + 2 - это то же самое, что x + (5 + 2)). Заявления, с другой стороны, используются для упорядочения побочных эффектов, то есть, как правило, приводят, например, к записи в какую-то область памяти.

Учитывая вышеизложенное, выражения безопасны для "вложения" в операторы, тогда как вложения в выражения - нет. Под «безопасным» я подразумеваю «не удивительные результаты».

В вашем примере у нас есть

x^=x || x++ || ++x;

В каком порядке должна проводиться оценка? С || оперирует выражениями, не важно, идем ли мы (x || x ++) || ++ x или x || (x ++ || ++ x) или даже ++ x || (х || х ++). Однако, поскольку x ++ и ++ x являются операторами (хотя C позволяет использовать их как выражения), мы не можем продолжать алгебраические рассуждения. Итак, вам нужно будет явно указать порядок операций, написав несколько операторов.

0 голосов
/ 27 января 2011

XOR 0 с 0 равно 0. Тогда ++ дважды равен 2. Тем не менее, как указано в других ответах, нет последовательности точек. Таким образом, на выходе может быть что угодно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...