C++ 自增自减

发布时间:2024-05-16 23:12 发布:上海旅游网

问题描述:

main()
{
int i=5,j=5;

cout<<(++i)+(++i)+(++i)<<endl;
cout<<(++j)+((++j)+(++j))<<endl;
cout<<((++j)+(++j)+(++j))<<endl;
}
如上。输出结果是22,24,31。请高手解释。
目的在于搞清自增自减机制,请勿作无建设性回答。在线等

问题解答:

这里其实解释一句你就明白了

cout<<(++i)+(++i)+(++i)<<endl;
i开始是 5 进入程序后 i 首先加1 所以 就是 ++i)+(++i) +(6)
然后,你想。 i到了下一个后。 i自身在加1 就是 (++i) + 7 + 6
同理, 就是 8+7+6
其实你知道这个道理就好
结果 取决于你用的编译器,但是道理是一样的。
在VC 2008上结果是

24
24
33

前2个应该是一样的,因为第2行你的代码初值是一样的。

不知道你用的是那个编译器。 建议你写成

#include <iostream>

using namespace std;

int main()
{
int i=5,j=5;

cout<<(++i)+(++i)+(++i)<<endl;
cout<<(++j)+((++j)+(++j))<<endl;
cout<<((++j)+(++j)+(++j))<<endl;
return 0;
}

遇到垃圾教材上的这种脑残题,请无视之.

好无聊的问题啊!谁会写这么恶心的代码?

这种代码和编译器是相关的,不同的编译器结果可能就不同,所以很多专家建议,i++,j--这种语句最好单独成一句,不要放在别的语句中。

你的想法很好,但是C语言的标准委员会并不支持你。

C语言的标准中特别规定了这种行为是不确定的行为。
标准中规定:
i++的值是i
++i的值是i+1
并且明确说明了,增量的生效时间是在本次取值之后,
本个表达式执行完成的任何时间。

举例说明
i=5;
j=(i++)+(i++);
就可以是10或者11,但是定义为不确定行为。类似的有很多。

比如:
int a=128;
67>>a,
标准委员会规定,如果a的值大于机器字长,那么得到的结果是任意的

根据规定可以推论,如果存在一个机器+3比三个+1快。
i=5;
j=(i++)+(i++)+(i++);
j就会是15。
显然,每次把i取出来相加,最后把三次+1,一起做了i=8是最快的。
所以,计算的机制不是这个表达式本身的事情,而是机器相关。
另外就是编译器不是完美的,它可能找不到最快的执行完程序的方法。

热点新闻