После прочтения Скрытые функции и темные углы C ++ / STL на comp.lang.c++.moderated
я был совершенно удивлен, что следующий фрагмент кода скомпилирован и работает как в Visual Studio 2008, так и в G ++ 4.4.
Вот код:
#include
int main()
{
int x = 10;
while (x --> 0) // x goes to 0
{
printf("%d ", x);
}
}
Я бы предположил, что это C, так как он работает и в GCC. Где это определено в стандарте и откуда оно взято?
->
не оператор. Фактически это два отдельных оператора, -
и >
.
Код условия уменьшает x
, возвращая x
' s исходное (не уменьшенное) значение, а затем сравнивает исходное значение с 0
с помощью оператора >
.
Чтобы лучше понять, оператор может быть записан следующим образом:
while( (x--) > 0 )
(x --> 0)
средства (x-- > 0)
(x -->)
output -: 9 8 7 6 5 4 3 2 1 0
(-- x > 0)
, Это среднее (--x > 0)
output -: 9 8 7 6 5 4 3 2 1
(--\
\
x > 0)
output -: 9 8 7 6 5 4 3 2 1
(\
\
x --> 0)
output -: 9 8 7 6 5 4 3 2 1 0
(\
\
x --> 0
\
\
)
output -: 9 8 7 6 5 4 3 2 1 0
(
x
-->
0
)
output -: 9 8 7 6 5 4 3 2 1 0
аналогично, можно попробовать партию методов для выполнения этой команды успешно
В любом случае, у нас теперь есть оператор перехода. «->»
легко запомнить как направление, а «пока x стремится к нулю» - прямое значение.
Кроме того,
Это
#include <stdio.h>
int main(void){
int x = 10;
while( x-- > 0 ){ // x goes to 0
printf("%d ", x);
}
return 0;
}
Просто пространство заставляет вещи выглядеть смешно, -
уменьшает, а >
сравнивает.
Это эквивалентно
while (x-- > 0)
x -
(пост-декремент) эквивалентно x = x-1
, поэтому код преобразуется в:
while(x > 0) {
x = x-1;
// logic
}
Это очень сложный оператор, поэтому даже ISO / IEC JTC1 (Объединенный технический комитет 1) поместил его описание в двух разных частях стандарта C ++.
Шутка. помимо этого, это два разных оператора: -
и >
, описанные соответственно в §5.2.6 / 2 и §5.9 стандарта C ++ 03.
Использование ->
имеет историческое значение. Уменьшение было (и остается в некоторых случаях) быстрее, чем увеличение на архитектуре x86. Использование ->
предполагает, что x
будет равно 0
, и обращается к тем, кто имеет математический опыт.
Этот код сначала сравнивает x и 0, а затем уменьшает x. (Также сказано в первом ответе: вы уменьшаете x, а затем сравниваете x и 0 с помощью оператора >
.) См. Вывод этого кода:
9 8 7 6 5 4 3 2 1 0
Теперь мы сначала сравниваем, а затем уменьшаем увидев на выходе 0.
Если мы хотим сначала уменьшить, а затем сравнить, используйте этот код:
#include <stdio.h>
int main(void)
{
int x = 10;
while( --x> 0 ) // x goes to 0
{
printf("%d ", x);
}
return 0;
}
Этот результат:
9 8 7 6 5 4 3 2 1