C中的一个语句中的递增和递减运算符
Increment and decrement operators in one statement in C
我知道这在理论上是未定义的行为,当然也是糟糕的风格。这是一个学校的例子(我不是小学生)。
但为什么我得到 7(示例 a)resp。 1(示例 b)出此操作:
在线示例:
https://onlinegdb.com/B172lj8k8
一个:
#include <stdio.h>
int main()
{
int i = 2;
printf("%d; i=%d", ++i + i++, i);
return 0;
}
b:
#include <stdio.h>
int main()
{
int i = 2;
printf("%d; i=%d", ++i - i++, i);
return 0;
}
我认为输出应该是 6 和 2。
- 执行i++,yield 2,递增i
- 执行++i yield 4
- 附加 2 + 4
另一个例子应该是 4 - 2。
在一个语句中执行自增似乎立即产生自增的结果,无论是后缀还是前缀,这很奇怪。还是我完全弄错了?
未指定传递给函数的参数的求值顺序,+
的操作符的求值顺序也未指定。
因此在 printf("%d %d", i+1, i-1)
中,例如,您不能依赖参数的评估顺序;实际上,i+1
可能会在 i-1
之后被评估;你不会承认,因为对一个的评估不会影响另一个的结果。
与 "side effects" 结合使用 post 递增 i++
,但是,在特定时间点递增 i
的效果可能会影响结果其他评价基于i
。因此,在C中是"undefined behaviour",如果一个变量在一个表达式中被多次使用,并且副作用改变了它的值(形式上,准确地说,如果中间没有序列点)。
我知道这在理论上是未定义的行为,当然也是糟糕的风格。这是一个学校的例子(我不是小学生)。 但为什么我得到 7(示例 a)resp。 1(示例 b)出此操作:
在线示例: https://onlinegdb.com/B172lj8k8
一个:
#include <stdio.h>
int main()
{
int i = 2;
printf("%d; i=%d", ++i + i++, i);
return 0;
}
b:
#include <stdio.h>
int main()
{
int i = 2;
printf("%d; i=%d", ++i - i++, i);
return 0;
}
我认为输出应该是 6 和 2。
- 执行i++,yield 2,递增i
- 执行++i yield 4
- 附加 2 + 4
另一个例子应该是 4 - 2。
在一个语句中执行自增似乎立即产生自增的结果,无论是后缀还是前缀,这很奇怪。还是我完全弄错了?
未指定传递给函数的参数的求值顺序,+
的操作符的求值顺序也未指定。
因此在 printf("%d %d", i+1, i-1)
中,例如,您不能依赖参数的评估顺序;实际上,i+1
可能会在 i-1
之后被评估;你不会承认,因为对一个的评估不会影响另一个的结果。
与 "side effects" 结合使用 post 递增 i++
,但是,在特定时间点递增 i
的效果可能会影响结果其他评价基于i
。因此,在C中是"undefined behaviour",如果一个变量在一个表达式中被多次使用,并且副作用改变了它的值(形式上,准确地说,如果中间没有序列点)。