我想增加一个变量,所以 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
,则不能++
对其使用运算符:和
++
运算--
符既有结果又有副作用:运算符将修改存储在操作数中的值。
简单回答是不”。总是有更新到递增值
++c
的副作用。c
使用表达式的值时,唯一的选择是返回原始值(使用 post-increment
c++
)还是更新后的值(使用 pre-increment++c
)。要获取增量值而不更新变量,请使用
c + 1
。这没有捷径。让我们尝试分解它。首先,您需要了解运算符如何工作(对您来说幸运的是,它们在 C 中的工作方式与 C++、C#、D、java 和许多类似语言中的工作方式相同,因此这实际上是一个非常有用的课程)。您还需要了解
++
(或--
) 相对于+1
(或-1
) 的作用以及需要在何处使用它们。因此,在继续阅读之前,请“暂停”这个答案并阅读一些有关 C 运算符的内容(是的,所有这些运算符,相信我,不存在“我不需要那个”这样的事情......或者更好说,如果你想学习如何编写代码,则不存在“我不需要那个”这样的事情,无论使用哪种语言)。如果您完成了“外部”小课程,现在您应该拥有以下信息:
你应该知道
c
is 1、d
is 2 和e
is 2。但让我们尝试一些 pre* 和 post* 运算符。
这里,
c
is 1、d
is 2 和e
is 2,f 是 5(首先是 4,然后递增一次),g 也是 5(相同的想法)。但是等等,这不是一样吗?“是”和“否”(大部分是“否”,因此“是”中的引号)。c
是1,首先d
是2,然后e
是2,f
是5,但是d
变成了3。为什么呢?因为+
与标准数学运算(基本1 + 1 = 2
)不同,++
它还会修改变量(或参数,取决于情况)的值。言语上的区别是:
c + 1
:如果你把你的值加1,结果会是什么?(初始值不变,但结果不同)c++
:如果让你增值,结果会怎样?(初始值被改变,因为它是递增的,它被操纵了)换句话说,仅当您希望该 var(或 param)的值也发生更改时,才使用
++
and 。--
所以你可能会问“好吧,好吧,通常情况下,我会有带有我需要的值的变量或参数,那么为什么我要以可能弄乱我的代码的方式更改这些值呢?”。嗯,它取决于工作流程,但在大多数情况下,++
并且--
在迭代中使用。这不是它们的唯一用法,但却是最常见的一种。但您的另一个好奇心可能是“好吧,很好,但是什么时候使用
++x
以及什么时候使用x++
?”。答案是“这取决于”。在for
循环中,这并不重要。在do-while
,可能会。pre* 和 post* 运算符之间的区别在于,在前运算符中,首先更改值,然后使用该值,而在后运算符中,使用当前值,然后更改它。但让我给你举一个我的项目的例子。不幸的是它是用 C# 编写的(所以请原谅意大利面条),但正如前面讨论的,逻辑是相同的:
它基本上是有限数量的帧的数组,它推进每一帧以给出“电影”的错觉,然后当它到达结尾时,它重置到第一帧并一遍又一遍地循环。但让我们专注于我们的主题:
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
。您不能按照您建议的方式使用 ++ 增量运算符来实现此目的。++ 改变变量的值。
现在c是5,d也是5,因为c先递增,然后返回给赋值运算符。
现在 d 是 4,c 是 5,因为 c 首先返回给赋值运算符,然后递增。
OP 要求的是
这样 d 为 5,c 仍为 4。这不能用 ++ 来完成。可以使用旧的 + 运算符来完成:
++ 将在赋值之前或之后更改 c。
找到解决方案:
返回:
https://godbolt.org/z/3ojv7enW6
或做对
https://godbolt.org/z/h3bnMva6M