C语言自增运算

发布时间:2024-05-14 02:57 发布:上海旅游网

问题描述:

#include <stdio.h>
main()
{
int i=3,k,k1,k2;
k=(i++)+(++i)+(i++);
printf("%d",k,i);
getch();
}
是 12 ,6 我觉得应该是 13,6 的
谁能详细帮我讲解下 我新手 谢谢了呀!

问题解答:

k=(i++)+(++i)+(i++);
这样的题的做法如下,这只是个解题的巧门,实际问题不会遇到这种情况的,无聊的人出这题
把++i都放在计算K值前边,i++放后边
++i; //有几个++i放几个
k=i+i+i;
i++;
i++;

i先自加一次变成4.k=3k=3*4=12
i再自加两次变成6

运算顺序:
(i++) // (i++)=3 ,运算后 i=4
(++i) // (++i)=5 ,运算后 i=5
(i++)// (i++)=5,运算后 i=6
所以:K=3+5+5=13,而i=6。

这个要看编译器的。。。
不同的编译器会不一样的,通常编译器会从后往前编译,也就是先算最后一个i++,再去算++i,最后是最前面的i++,得到的是5+5+3=13,当然也有编译器会整个语句编译,那样的话就是3+5+4,得到的12据说TC是这样子的,Apple一直用DevC++的,出来的是13

k=(i++)+(++i)+(i++);
你可犯了个大的错误啊,你要想得出正解就要这样定义
int r, s, t;
r = ++i;
s = ++i;
t = ++i;
k = r + s + t;
因为分号是一个顺序点,C编译器k=(i++)+(++i)+(i++); 的编译顺序是任意的,它要,理论上所有++操作和赋值操作的副作用都要在分号之后才生成。但是这一点并不是强制编译器必须要等到分号结束之后才执行赋值操作,只是规定相邻两个顺序点之间的表达式求值所产生的副作用只有等到下一个顺序点结束才是确定的。而在这个顺序点结束之前,编译器对位于该个顺序点和前一个顺序点之间的表达式以任意顺序求值,k=(i++)+(++i)+(i++); 表达式都违反了C语言有关顺序点的规定,编译器给出的值也具有一定的任意性,没有人能确切地告诉你它们的值,你只能去问编译器了。所以我建议你不要这样写,以后做软件可要注意啊!

因为 ++ 在变量左边,变量先加1,然后参与运算。++ 在变量右边,变量先参与运算,再加1.上面 公式 有一个 ++i,所以i先加1. =3+1 =4
k = 4 + 4 + 4 = 12

为什么你觉得是13呢??

热点新闻