| оператор, оператор ++ и I - PullRequest
3 голосов
/ 20 марта 2012

Я думаю, что получу 12, а не 7. w++, тогда w будет 4, что составляет 100, а w++, w будет 8, 1000; поэтому w++|z++ будет 100|1000 = 1100 будет 12.

что со мной не так?

int main()
{
    int  w=3, z=7; 
    printf("%d\n", w++|z++);
}

Ответы [ 6 ]

3 голосов
/ 20 марта 2012

Вы неправильно понимаете оператор postfix ++. Значение переменной используется до , переменная увеличивается. Ваш анализ будет правильным для оператора prefix ++, как в ++w|++z.

2 голосов
/ 20 марта 2012

Это пост операторы приращения;они вступают в силу после операции, поэтому в операции используются 3 и 7.

2 голосов
/ 20 марта 2012

Проблема в том, что, используя w++|z++, вы сначала используете значение w и обращаетесь к нему с текущим значением z, а затем увеличиваете каждый.Вместо этого используйте ++w|++z, и числа будут сначала увеличиваться, затем использоваться.

int main()
{
    int x = 10;

    // prints 10
    printf("%d\n", x++);
    // prints 11
    printf("%d\n", x);

    x = 10;
    // prints 11
    printf("%d\n" ++x);
    // prints 11
    printf("%d\n" x);
}

То же самое можно сделать с --x и x--.Для получения дополнительной информации см. этот соответствующий вопрос .

1 голос
/ 20 марта 2012

Вы делаете постинкремент (i++), который сначала принимает значение i, а затем только увеличивает его значение.

Если вы хотите добиться того, что сказали в своем вопросе, сделайте следующее: ++w | ++z

1 голос
/ 20 марта 2012

x++ увеличивает x, но возвращает старое значение w.

Таким образом, w++|z++ оценивается как 3|7 (что в вашей реализации равно 7) и увеличивает w и z в качестве побочного эффекта.

Если вы хотите, чтобы поведение, которое вы ожидали, вы могли бы использовать префиксный оператор ++x, который увеличивает его x и возвращает новое значение x.

0 голосов
/ 20 марта 2012

Возможно, вы неправильно поняли оператор post-increment, который очень распространен среди начинающих, так что не волнуйтесь.Со временем вы все поймете правильно.

Взгляните на слово post-increment.В нем есть слово post, которое обычно означает after.Это означает, что приращение произойдет after все остальное было выполнено.Вот как я это запомнил.

Итак, если вы посмотрите на свою программу сейчас -

int main()
{
    int  w=3, z=7; 
    printf("%d\n", w++|z++);
}

, тогда станет ясно, что после того, как сама функция printfбыл выполнен, приращение произойдет.Таким образом, вы получите значения w и z как 3 и 7 соответственно при оценке выражения второго аргумента printf.

Официальный стандарт C ++ 11, (§5.2.6, окончательная версия) говорит -

Значением выражения postfix ++ является значение его операнда.[Примечание: полученное значение является копией исходного значения - примечание конца]

Таким образом, это означает, что значение выражения postfix w++, является значением самого операнда, то естьзначение w, которое равно 3, а значение второго выражения z++ будет равно 7. Эти значения будут затем использоваться при вычислении 3|7, и после этого переменные будут увеличиваться.

...