2012-03-20 3 views
3

Я думаю, что я получу 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

«Что случилось со мной?» Мы не знаем. –

+2

Возможно, вы ... но приоритет оператора, о котором вы думаете, не так: –

+0

Вы должны создать минимальный пример, показывающий вашу проблему. Удалите бит 'x' и' i' и 'scanf'. –

ответ

2

Проблема заключается в том, что с помощью w++|z++, вы первым использованием значения w и ORing, что текущим значением 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--. Для получения дополнительной информации см. this relevant question.

3

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

2

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

+0

Фактически, 'w' и' z' _are_ уже '4' и' 7', когда используется 'w ++ | z ++', просто случается, что 'w ++' и 'z ++' оценивают старые значения 'w' и' z'. – Mankarse

+0

@Mankarse: Исправлено. –

1

x++ Приращения x, но он оценивает старое значение w.

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

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

1

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

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

0

Вы, наверное, поняли 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, окончательная версия) говорит -

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

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

Смежные вопросы