Quero incrementar uma variável para que c seja 4 e d seja c++ (assim como 5)
Este código funciona
#include <stdio.h>
int main()
{
int c = 4;
int d = ++c ;
printf("Value of c is: %d \n", c);
printf("Value of d is: %d \n", d);
}
O problema é que retorna 5 para c e d.
Value of c is: 5
Value of d is: 5
Quero obter isso:
Value of c is: 4
Value of d is: 5
Minha ideia é declarar uma var(c) atribuir 4 a c, depois declarar d e atribuir valor de c++ a d. Algo assim no bash, mas usando ++ e não +1 (é muito fácil)
#!/bin/bash
c=4
echo "C is now $c"
d=$((++c))
echo "D is now $d"
Alguma sugestão?
Se você não quiser alterar o valor de
c
, não poderá usar o++
operador nele:Os operadores
++
e--
têm um resultado e um efeito colateral :Os operadores modificarão o valor armazenado no operando.
A resposta simples é “não”.
++c
sempre tem o efeito colateral de atualizarc
para o valor incrementado.Ao usar o valor da expressão, a única escolha é retornar o valor original (com pós-incremento
c++
) ou o valor atualizado (com pré-incremento++c
).Para obter o valor incrementado sem atualizar a variável, use
c + 1
. Não há atalho para isso.Vamos tentar decompô-lo. Primeiro, você precisa entender como os operadores funcionam (para sua sorte, a forma como eles funcionam em C é a mesma que em C++, C#, D, java e muitas linguagens similares, então é realmente uma lição muito útil). Você também precisa entender o que
++
(ou--
) faz em oposição a+1
(ou-1
) e onde precisa usar cada um. Portanto, antes de continuar lendo, por favor, "pause" esta resposta e faça algumas leituras sobre os operadores C (sim, TODOS eles, acredite, não existe "Não vou precisar desse "... ou melhor dito, não existe "não vou precisar desse " se você quiser aprender a escrever código, independentemente da linguagem).Se você terminou sua pequena lição "externa", agora você deve ter as seguintes informações:
E você deve saber
c
que é 1,d
é 2 ee
é 2 também.Mas vamos tentar alguns operadores pré* e pós*.
Aqui você tem
c
1,d
é 2 ee
é 2, f é 5 (primeiro era 4, depois foi incrementado uma vez), g também é 5 (mesma ideia). Mas espere, não é a mesma coisa? "Sim" e Não (principalmente Não, daí as aspas em "Sim").c
é 1, primeirod
é 2 ee
é 2,f
é 5, masd
vira 3. Por quê? Porque ao contrário+
de qual é uma operação matemática padrão (a básica1 + 1 = 2
),++
também modifica o valor da variável (ou parâmetro, dependendo do caso).A diferença na fala seria:
c + 1
: Se você adicionasse 1 ao seu valor, qual seria o resultado? (o valor inicial permanece inalterado, mas o resultado é diferente)c++
: Se você incrementasse seu valor, qual seria o resultado? (o valor inicial é alterado, porque é incrementado, é manipulado)Em outras palavras, use
++
e--
somente se desejar que o valor dessa var (ou parâmetro) também mude. Então você pode perguntar "ok, tudo bem, normalmente terei vars ou params com os valores que preciso, então por que eu iria querer alterar esses valores de uma forma que pudesse atrapalhar meu código?". Bem, depende do fluxo de trabalho, mas na maioria dos casos++
é--
usado em iterações. Esse não é o único uso deles, mas é o mais comum.Mas sua outra curiosidade pode ser “OK, tudo bem, mas quando usar
++x
e quando usarx++
?”. A resposta é “depende”. Emfor
loops, isso não importa. Emdo-while
, pode ser. A diferença entre os operadores pré* e pós* é que no caso de um pré-operador o valor é alterado primeiro, depois o valor é usado, enquanto nos pós-operadores o valor atual é usado e depois é alterado .Mas deixe-me dar um exemplo de um projeto meu. Infelizmente está em C# (desculpe o espaguete), mas como discutido anteriormente, a lógica é a mesma:
É basicamente uma matriz de um número limitado de quadros, avança cada quadro para dar a ilusão de um “filme” e, quando chega ao fim, volta ao primeiro quadro e faz um loop indefinidamente. Mas vamos nos concentrar em nosso tópico:
return m_Frames[currentSequence ++];
Qual é a diferença entre
m_Frames[currentSequence++]
em_Frames[++currentSequence]
?No caso de
currentSequence++
eu basicamente dizer ao código "pegue o arraym_Frames
, use o elemento com o id que é o valor decurrentSequence
, depois de vocêreturn
incrementá-lo em 1, para que na próxima vez que fizermos o loop, tenhamos o próximo quadro em nosso filme ".Se eu usasse
++currentSequence
, então a sequência seria dessincronizada, pois primeiro iria incrementar (sempre pulando o primeiro quadro) e depois usaria o quadro e o loop, pois primeiro mudaria o valor, depois usaria o valor dele, que não é o que Eu queria).E é isso que acontece com o seu
int d = ++c ;
.Espero ter conseguido explicar a essência disso :)
Claro, como outros já apontaram e como você provavelmente já deve ter percebido, para obter os valores desejados, você precisa fazer
int d = c + 1;
para NÃO alterar o valor dec
.Você não pode usar o operador de incremento ++ para conseguir isso da maneira sugerida. ++ altera o valor da variável.
Agora c é 5 e d também é 5, porque c é incrementado primeiro e depois retornado ao operador de atribuição.
Agora d é 4 e c é 5, porque c é primeiro retornado ao operador de atribuição e depois incrementado.
O que o OP pede é que
então d é 5 e c permanece 4. Isso não pode ser feito com ++. Isso pode ser feito com o bom e velho operador +:
++ mudará c, antes ou depois da atribuição.
Solução encontrada:
retornar:
https://godbolt.org/z/3ojv7enW6
ou para acertar
https://godbolt.org/z/h3bnMva6M