AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 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

对 ++ 的增量感到困惑

  • 772

我想增加一个变量,所以 c 是 4,d 是 c ++ (所以是 5)

这段代码有效

#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);
}

问题是 c 和 d 返回 5。

Value of c is: 5 
Value of d is: 5 

我想获得这个:

Value of c is: 4
Value of d is: 5 

我的想法是声明一个var(c)将4赋值给c,然后声明d并将c++的值赋给d。bash 上有类似的东西,但使用 ++ 而不是 +1 (太简单了)

#!/bin/bash
c=4

echo "C is now $c"

d=$((++c))

echo "D is now $d"

有什么建议吗?

c
  • 6 6 个回答
  • 155 Views

6 个回答

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

    如果您不想更改 的值c,则不能++对其使用运算符:

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

    和++运算--符既有结果又有副作用:

    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
    

    运算符将修改存储在操作数中的值。

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

    简单回答是不”。总是有更新到递增值++c的副作用。c

    使用表达式的值时,唯一的选择是返回原始值(使用 post-increment c++)还是更新后的值(使用 pre-increment ++c)。

    要获取增量值而不更新变量,请使用c + 1。这没有捷径。

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

    让我们尝试分解它。首先,您需要了解运算符如何工作(对您来说幸运的是,它们在 C 中的工作方式与 C++、C#、D、java 和许多类似语言中的工作方式相同,因此这实际上是一个非常有用的课程)。您还需要了解++(或--) 相对于+1(或-1) 的作用以及需要在何处使用它们。因此,在继续阅读之前,请“暂停”这个答案并阅读一些有关 C 运算符的内容(是的,所有这些运算符,相信我,不存在“我不需要那个”这样的事情......或者更好说,如果你想学习如何编写代码,则不存在“我不需要那个”这样的事情,无论使用哪种语言)。

    如果您完成了“外部”小课程,现在您应该拥有以下信息:

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

    你应该知道cis 1、dis 2 和eis 2。

    但让我们尝试一些 pre* 和 post* 运算符。

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

    这里,cis 1、dis 2 和eis 2,f 是 5(首先是 4,然后递增一次),g 也是 5(相同的想法)。但是等等,这不是一样吗?“是”和“否”(大部分是“否”,因此“是”中的引号)。

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

    c是1,首先d是2,然后e是2,f是5,但是d变成了3。为什么呢?因为+与标准数学运算(基本1 + 1 = 2)不同,++它还会修改变量(或参数,取决于情况)的值。

    言语上的区别是:

    1. c + 1:如果你把你的值加1,结果会是什么?(初始值不变,但结果不同)
    2. c++:如果让你增值,结果会怎样?(初始值被改变,因为它是递增的,它被操纵了)

    换句话说,仅当您希望该 var(或 param)的值也发生更改时,才使用++and 。--所以你可能会问“好吧,好吧,通常情况下,我会有带有我需要的值的变量或参数,那么为什么我要以可能弄乱我的代码的方式更改这些值呢?”。嗯,它取决于工作流程,但在大多数情况下,++并且--在迭代中使用。这不是它们的唯一用法,但却是最常见的一种。

    但您的另一个好奇心可能是“好吧,很好,但是什么时候使用++x以及什么时候使用x++?”。答案是“这取决于”。在for循环中,这并不重要。在do-while,可能会。pre* 和 post* 运算符之间的区别在于,在前运算符中,首先更改值,然后使用该值,而在后运算符中,使用当前值,然后更改它。

    但让我给你举一个我的项目的例子。不幸的是它是用 C# 编写的(所以请原谅意大利面条),但正如前面讨论的,逻辑是相同的:

    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 ++];
    }       
    

    它基本上是有限数量的帧的数组,它推进每一帧以给出“电影”的错觉,然后当它到达结尾时,它重置到第一帧并一遍又一遍地循环。但让我们专注于我们的主题:return m_Frames[currentSequence ++];

    m_Frames[currentSequence++]和 和有什么区别m_Frames[++currentSequence]?

    在这种情况下,currentSequence++我基本上告诉代码“获取数组m_Frames,使用 id 为值的元素currentSequence,然后在return它之后,将其增加 1,这样下次循环时,我们就有了下一帧我们的电影”。

    如果我要使用++currentSequence,那么序列将不同步,因为它会首先递增(总是跳过第一帧),然后使用帧和循环,因为它会首先更改值,然后使用它的值,这不是什么我想了)。

    这就是你的int d = ++c ;.

    希望我能解释它的要点:)

    当然,正如其他人已经指出的那样以及您现在可能已经发现的那样,为了获得您想要的值,您需要做的是int d = c + 1;不更改的值c。

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

    您不能按照您建议的方式使用 ++ 增量运算符来实现此目的。++ 改变变量的值。

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

    现在c是5,d也是5,因为c先递增,然后返回给赋值运算符。

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

    现在 d 是 4,c 是 5,因为 c 首先返回给赋值运算符,然后递增。

    OP 要求的是

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

    这样 d 为 5,c 仍为 4。这不能用 ++ 来完成。可以使用旧的 + 运算符来完成:

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

    ++ 将在赋值之前或之后更改 c。

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

    找到解决方案:

    #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);
    }
    

    返回:

    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

    或做对

    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

相关问题

  • 比 * 更快的乘法

  • 在 C 中的 scanf() 格式说明符中使用宏获取字符串长度

  • 如何将#define的数据类型设置为long double?

  • 不兼容的常量指针

  • OpenGL 中的非渐变颜色变化

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    使用 <font color="#xxx"> 突出显示 html 中的代码

    • 2 个回答
  • Marko Smith

    为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类?

    • 1 个回答
  • Marko Smith

    您可以使用花括号初始化列表作为(默认)模板参数吗?

    • 2 个回答
  • Marko Smith

    为什么列表推导式在内部创建一个函数?

    • 1 个回答
  • Marko Smith

    我正在尝试仅使用海龟随机和数学模块来制作吃豆人游戏

    • 1 个回答
  • Marko Smith

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

    • 3 个回答
  • Marko Smith

    为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)?

    • 4 个回答
  • Marko Smith

    为什么库中不调用全局变量的构造函数?

    • 1 个回答
  • Marko Smith

    std::common_reference_with 在元组上的行为不一致。哪个是对的?

    • 1 个回答
  • Marko Smith

    C++17 中 std::byte 只能按位运算?

    • 1 个回答
  • Martin Hope
    fbrereto 为什么在传递 {} 时重载解析更喜欢 std::nullptr_t 而不是类? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 您可以使用花括号初始化列表作为(默认)模板参数吗? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi 为什么列表推导式在内部创建一个函数? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A fmt 格式 %H:%M:%S 不带小数 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python C++20 的 std::views::filter 未正确过滤视图 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute 为什么 'char -> int' 是提升,而 'char -> Short' 是转换(但不是提升)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa 为什么库中不调用全局变量的构造函数? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis std::common_reference_with 在元组上的行为不一致。哪个是对的? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev 为什么编译器在这里错过矢量化? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan C++17 中 std::byte 只能按位运算? 2023-08-17 17:13:58 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve