Eu gostaria de incrementar duas variáveis em um for
condição -loop em vez de uma.
Então, algo como:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
Qual é a sintaxe para isso?
fonte
Eu gostaria de incrementar duas variáveis em um for
condição -loop em vez de uma.
Então, algo como:
for (int i = 0; i != 5; ++i and ++j)
do_something(i, j);
Qual é a sintaxe para isso?
Um idioma comum é usar o operador vírgula que avalia os dois operandos e retorna o segundo operando. Portanto:
for(int i = 0; i != 5; ++i,++j)
do_something(i,j);
Agora que escreveu isso, um comentarista sugeriu que era na verdade algum açúcar sintático especial na instrução for, e não um operador vírgula. Verifiquei isso no GCC da seguinte forma:
int i=0;
int a=5;
int x=0;
for(i; i<5; x=i++,a++){
printf("i=%d a=%d x=%d\n",i,a,x);
}
Eu esperava que x pegasse o valor original de a, então deveria ter mostrado 5,6,7 .. para x. O que eu consegui foi isso
i=0 a=5 x=0
i=1 a=6 x=0
i=2 a=7 x=1
i=3 a=8 x=2
i=4 a=9 x=3
No entanto, se eu colocar a expressão entre colchetes para forçar o analisador a realmente ver um operador vírgula, recebo isso
int main(){
int i=0;
int a=5;
int x=0;
for(i=0; i<5; x=(i++,a++)){
printf("i=%d a=%d x=%d\n",i,a,x);
}
}
i=0 a=5 x=0
i=1 a=6 x=5
i=2 a=7 x=6
i=3 a=8 x=7
i=4 a=9 x=8
Inicialmente pensei que isso mostrava que não estava se comportando como um operador vírgula, mas, ao que parece, isso é simplesmente um problema de precedência - o operador vírgula tem a precedência mais baixa possível , então a expressão x = i ++, a ++ é eficaz analisado como (x = i ++), a ++
Obrigado por todos os comentários, foi uma experiência de aprendizado interessante, e uso o C há muitos anos!
Tente isto
fonte
for( ; ; ((++i), (++j)) )
for(int i = 0; i != 5; (++i)) {
o parêntese extra engana o compilador fazendo-o pensar que não é mais uma operação de "incremento".Tente não fazer isso!
De http://www.research.att.com/~bs/JSF-AV-rules.pdf :
fonte
fonte
Vim aqui para me lembrar de como codificar um segundo índice na cláusula de incremento de um loop FOR, o que eu sabia que poderia ser feito principalmente por observá-lo em um exemplo que incorporei em outro projeto, aquele escrito em C ++.
Hoje estou trabalhando em C #, mas tive certeza de que obedeceria às mesmas regras nesse aspecto, já que a instrução FOR é uma das estruturas de controle mais antigas em toda a programação. Felizmente, recentemente passei vários dias documentando precisamente o comportamento de um loop FOR em um de meus programas C mais antigos, e percebi rapidamente que esses estudos continham lições que se aplicavam ao problema C # atual, em particular ao comportamento da segunda variável de índice .
Para os incautos, a seguir está um resumo de minhas observações. Tudo o que vi acontecendo hoje, ao observar cuidadosamente as variáveis na janela Locals, confirmou minha expectativa de que uma instrução C # FOR se comporta exatamente como uma instrução C ou C ++ FOR.
Se alguma de suas variáveis de índice permanecer no escopo quando o loop terminar, seu valor será um maior do que o limite que interrompe o loop, no caso da variável de índice verdadeira. Da mesma forma, se, por exemplo, a segunda variável for inicializada com zero antes de o loop ser inserido, seu valor no final será a contagem de iteração, assumindo que é um incremento (++), não um decremento, e que nada em o corpo do loop muda seu valor.
fonte
Eu concordo com o squelart. Incrementar duas variáveis é propenso a bugs, especialmente se você testar apenas uma delas.
Esta é a maneira legível de fazer isso:
For
os loops são destinados aos casos em que o seu loop é executado em uma variável crescente / decrescente. Para qualquer outra variável, altere-a no loop.Se você precisa
j
estar vinculado ai
, por que não deixar a variável original como está e adicionari
?Se sua lógica for mais complexa (por exemplo, você precisa monitorar mais de uma variável), eu usaria um
while
loop.fonte
fonte
i
ea
local para o loop?Use matemática. Se as duas operações dependem matematicamente da iteração do loop, por que não fazer as contas?
Ou, mais especificamente referindo-se ao exemplo do OP:
Especialmente se você estiver passando para uma função por valor, deverá obter algo que faça exatamente o que você deseja.
fonte