AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77477055
Accepted
elbarna
elbarna
Asked: 2023-11-14 05:46:12 +0800 CST2023-11-14 05:46:12 +0800 CST 2023-11-14 05:46:12 +0800 CST

Confuso sobre incremento com ++

  • 772

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?

c
  • 6 6 respostas
  • 155 Views

6 respostas

  • Voted
  1. John Bode
    2023-11-14T06:06:36+08:002023-11-14T06:06:36+08:00

    Se você não quiser alterar o valor de c, não poderá usar o ++operador nele:

    Expression    Value of c   Value of d
    ----------    ----------   ----------
       d = c++             5            4
       d = ++c             5            5
     d = c + 1             4            5
    

    Os operadores ++e --têm um resultado e um efeito colateral :

    Expression        Result                  Side effect
    ----------        ------                  -----------
           x++        Current value of x      x <- x + 1
           ++x        Current value of x + 1  x <- x + 1
           x--        Current value of x      x <- x - 1
           --x        Current value of x - 1  x <- x - 1
    

    Os operadores modificarão o valor armazenado no operando.

    • 5
  2. Barmar
    2023-11-14T05:59:45+08:002023-11-14T05:59:45+08:00

    A resposta simples é “não”. ++csempre tem o efeito colateral de atualizar cpara 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.

    • 4
  3. Best Answer
    TheNomad
    2023-11-14T06:19:07+08:002023-11-14T06:19:07+08:00

    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:

    void func()
    {
        int c = 1;
        int d = 2;
        int e = c + 1;
    }
    

    E você deve saber cque é 1, dé 2 e eé 2 também.

    Mas vamos tentar alguns operadores pré* e pós*.

    void func()
    {
        int c = 1;
        int d = 2;
        int e = c + 1;
        int f = d + 2;
        int g = d + 2;
        ++f;
        g++;
    }
    

    Aqui você tem c1, dé 2 e eé 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").

    void func()
    {
        int c = 1;
        int d = 2;
        int e = c + 1;
        int f = ++d + 2;
    }
    

    cé 1, primeiro dé 2 e eé 2, fé 5, mas dvira 3. Por quê? Porque ao contrário +de qual é uma operação matemática padrão (a básica 1 + 1 = 2), ++também modifica o valor da variável (ou parâmetro, dependendo do caso).

    A diferença na fala seria:

    1. c + 1: Se você adicionasse 1 ao seu valor, qual seria o resultado? (o valor inicial permanece inalterado, mas o resultado é diferente)
    2. 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 ++xe quando usar x++?”. A resposta é “depende”. Em forloops, isso não importa. Em do-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:

    public Texture GetNextAnimationFrame(ref uint currentSequence)
    {
        if (m_Frames.Length == 1)
            return m_Frames[0];
    
        if (currentSequence >= m_Frames.Length)
            currentSequence = 0;
    
        return m_Frames[currentSequence ++];
    }       
    

    É 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++]e m_Frames[++currentSequence]?

    No caso de currentSequence++eu basicamente dizer ao código "pegue o array m_Frames, use o elemento com o id que é o valor de currentSequence, depois de você returnincrementá-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 de c.

    • 2
  4. Gec
    2023-11-14T06:06:51+08:002023-11-14T06:06:51+08:00

    Você não pode usar o operador de incremento ++ para conseguir isso da maneira sugerida. ++ altera o valor da variável.

    int c = 4;
    int d = ++c ;
    

    Agora c é 5 e d também é 5, porque c é incrementado primeiro e depois retornado ao operador de atribuição.

    int c = 4;
    int d = c++;
    

    Agora d é 4 e c é 5, porque c é primeiro retornado ao operador de atribuição e depois incrementado.

    O que o OP pede é que

    int c = 4;
    int d = [some ++ usage on c];
    

    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 +:

    int c = 4;
    int d = c + 1;
    

    ++ mudará c, antes ou depois da atribuição.

    • 0
  5. elbarna
    2023-11-14T06:07:02+08:002023-11-14T06:07:02+08:00

    Solução encontrada:

    #include <stdio.h>
    
    int main()
    {
    int c = 4;
    
    printf("Value of c is: %d \n", c);
    
    int d = ++c ;
    
    printf("Value of d is: %d \n", d);
    }
    

    retornar:

    Value of c is: 4 
    Value of d is: 5 
          
    
    • 0
  6. gulpr
    2023-11-14T05:53:33+08:002023-11-14T05:53:33+08:00
    int main()
    {
        int c = 4;
        int d = c;
    
        d = c++,c;
    
        printf("Value of c is: %d \n", c);
        printf("Value of d is: %d \n", d);
    }
    

    https://godbolt.org/z/3ojv7enW6

    ou para acertar

    int main()
    {
        int c = 4;
        int d = c;
    
        c = d++;
    
        printf("Value of c is: %d \n", c);
        printf("Value of d is: %d \n", d);
    }
    

    https://godbolt.org/z/h3bnMva6M

    • -1

relate perguntas

  • Multiplicação mais rápida que *

  • Usando uma macro para comprimento de string no especificador de formato scanf () em C

  • Como você pode definir o tipo de dados de #define para long double?

  • Ponteiros const incompatíveis

  • Mudança de cor não gradual no OpenGL

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve