C语言中有许多奇怪的运算符,本期我们介绍一下C语言中的递增运算符以及递减运算符。
i++ 和 ++i 都等价于 i = i + 1;
他的目的是简化i = i +1;运算,但是++i和i++表现在行为上的不同,++i是 前置递增运算符 , 它先将 i
的值增加1,然后返回增加后的值。换句话说,它会先执行递增操作,然后再进行其他操作。
可以看到,当我们赋值的时候,i++的时候此时i先是5赋值给a,再递增,所以输出的时候,a是5,i是6。 而当我们使用++i的时候, i先进行递增
,再将值赋值给a,这时候i的值为6,所以当我们输出a时候,结果是6。 在代码中常用这种方式,我们可以简化我们的代码。
for (int i = 0; i < 500; i++) { sin[i] = i; }
例如在for循环中,我们使用i++来代替i = i + 1;让我们可以遍历数据。
例如在嵌入式中,定时器进行采样的时候,可以用i++来替代数组的递增,可以帮助我们提高效率,让代码看上去更加简洁。
除了递增运算符之外,C语言中还有递减运算符以及前置递减运算符,i–和–i。其用法与递增预算符一样。
- ** 递增递减运算符在函数调用中出现的问题 **
但是当我们使用printf进行输出的时候,会发现此时居然是1和1,按照我的习惯来说,这里不应该是0和2嘛(一个先用再加,一个先加再用)。
在C语言中,对于函数参数的 计算顺序是未定义 的(Undefined Behavior)。这意味着在 printf 中的 i++ 和 ++i
的计算顺序是不确定的。编译器可能会按照自己的规则来计算参数,而这些规则可能会导致不同的结果。
具体来说,i++ 和 ++i 都会使 i 的值增加,但是它们的行为略有不同。i++ 是后置递增操作符,它会返回 i 的当前值然后再将 i 的值增加1。而
++i 是前置递增操作符,它会先将 i 的值增加1,然后返回增加后的值。
因此,printf 中的参数计算顺序是未定义的,编译器可能会按照自己的规则来计算。在某些编译器中,可能会先计算 i++,然后再计算 ++i,因此结果是 1,
1。而在其他编译器中,可能会先计算 ++i,然后再计算 i++,结果可能会不同。
为了避免这种不确定性,最好避免在同一个表达式中混合使用递增操作符,尤其是在函数调用中。可以将递增操作符分开,或者使用额外的变量来保存中间结果。
可以看到运算依旧是1和1。
** 关于这个问题具体是怎么产生具体没有研究过,如果广大观众朋友们有了解的朋友可以私信我感谢。 **