关于i---i和j=i---i

Aloneloop 2008-09-20 07:44:03
今天看到某论坛有人问这么一个问题
i,j都是整型变量.
打印输出i---i的值是1,而如果把i---i赋值给j,打印输出j的值就是0,这是为什么?
...全文
308 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
Teaerror 2008-09-20
  • 打赏
  • 举报
回复
这问题这么眼熟哦,我昨天才问过。
dirdirdir3 2008-09-20
  • 打赏
  • 举报
回复
编译器相关的...
isikawamoeko 2008-09-20
  • 打赏
  • 举报
回复
这个问题好无聊哦.
devil_zuiai 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 devil_zuiai 的回复:]
6: int n = 5;
00401048 mov dword ptr [ebp-4],5
7: printf("%d", n---n);
0040104F mov eax,dword ptr [ebp-4]
00401052 sub eax,dword ptr [ebp-4]
00401055 mov dword ptr [ebp-0Ch],eax
00401058 mov ecx,dword ptr [ebp-0Ch]
0040105B push ecx
0040105C push offset string "%d" (00431024)
00401061 mov edx,dword pt…
[/Quote]

VC6.0
devil_zuiai 2008-09-20
  • 打赏
  • 举报
回复
6: int n = 5;
00401048 mov dword ptr [ebp-4],5
7: printf("%d", n---n);
0040104F mov eax,dword ptr [ebp-4]
00401052 sub eax,dword ptr [ebp-4]
00401055 mov dword ptr [ebp-0Ch],eax
00401058 mov ecx,dword ptr [ebp-0Ch]
0040105B push ecx
0040105C push offset string "%d" (00431024)
00401061 mov edx,dword ptr [ebp-4]
00401064 sub edx,1
00401067 mov dword ptr [ebp-4],edx
0040106A call printf (004082c0)
0040106F add esp,8

8:
9: n = 5;
00401072 mov dword ptr [ebp-4],5
10: int j = n---n;
00401079 mov eax,dword ptr [ebp-4]
0040107C sub eax,dword ptr [ebp-4]
0040107F mov dword ptr [ebp-8],eax
00401082 mov ecx,dword ptr [ebp-4]
00401085 sub ecx,1
00401088 mov dword ptr [ebp-4],ecx

11: printf("%d", j);
0040108B mov edx,dword ptr [ebp-8]
0040108E push edx
0040108F push offset string "%d" (00431024)
00401094 call printf (004082c0)
00401099 add esp,8
zhuing1218 2008-09-20
  • 打赏
  • 举报
回复
我也觉得18楼有道理...都是视编译器而定的..就像printf("%d,%d",i++,++i);一样...不同编译器结果是不同的
HawHare 2008-09-20
  • 打赏
  • 举报
回复
但是不管是(i--)-i和i-(--i),得到的结果都应该是1,为什么赋值之后就是0了呢?
HawHare 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 insmile 的回复:]
这种无聊问题总是那些无聊的人才想的出来

说实话,谁会在项目里写这样的代码啊


这个应该给那些研究c++编译器的或者c++原理之类的人琢磨,简直就是浪费脑细胞的


(i--)-i或者i-(--i)这样都还不怎么好,同一个变量使用自增或者自减后在同一代码里继续使用--是个不好的编码习惯---极有可能出现未定义行为
[/Quote]

无聊的人只有一种,出考题的人...
insmile 2008-09-20
  • 打赏
  • 举报
回复
这种无聊问题总是那些无聊的人才想的出来

说实话,谁会在项目里写这样的代码啊


这个应该给那些研究c++编译器的或者c++原理之类的人琢磨,简直就是浪费脑细胞的


(i--)-i或者i-(--i)这样都还不怎么好,同一个变量使用自增或者自减后在同一代码里继续使用--是个不好的编码习惯---极有可能出现未定义行为
HawHare 2008-09-20
  • 打赏
  • 举报
回复
不过也有人说结果是0的
HawHare 2008-09-20
  • 打赏
  • 举报
回复
http://cache.baidu.com/c?m=9d78d513d9d430a44f9a9e690c66c0101e43f4132ba1d2020ea28449e3732b425011e5ac56210774a7d27d175ab8482cfd803165460537b6ebdffe4ecacb953f2ef83045070bf53205d269aedc4654d656964d9daf0ee6cae74290b9a5a5c82455dd24716df1839c2a7603cb1fab033093b1993e025e60aded4672fe296029e93441c61ceee142797786e1ac5a5bc25ac7171580df32a73f62a262d308685750e70cef070b6076a258268c592041d7ae4ae75d2e0878ef1beeaec1c1ba15d3cbea46c9a6d6ff7fd477e1b1bca2300067558e76e0f5aab24a370440cecbaa669961fcacb7ec5be862d1154bba590d597ccf1d94808c54f3&p=863b8916d9c411a05be8cb394444&user=baidu

或者这个
HawHare 2008-09-20
  • 打赏
  • 举报
回复
i---i的值是1 这是一道书上的题 你们去看看 不过我也不知道为什么赋值后变成0了
http://www.xici.net/b260288/d16388798.htm (选择题中的第14题)
LoneLock 2008-09-20
  • 打赏
  • 举报
回复
我看懂你的程序了,如果你得到的都是0的话,那么可能真的是编译器或机器的问题.
LoneLock 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zmlovelx 的回复:]
引用 4 楼 LoneLock 的回复:
谁说总是0的,i---i这个表达式的值是1,减一是后缀,先使用变量再计算表达式,假设i的值是5,i--的值就还是5,而第2个i变为了4,结果就是1.但是这个赋值结果变为0还是很难理解,不知道为什么,等高人.


C/C++ code
int main()
{
int i = 5;
int j = 5;
cout << i---i;
j = i---i;
cout << j;
return 0;
}



经过vc6.0 gcc测试 都是输出00
不知道你的编译器是啥.
也…
[/Quote]

我是用TC,你试试我10楼的程序在TC上运行.我是新手你的程序我看不懂.
帅得不敢出门 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 LoneLock 的回复:]
谁说总是0的,i---i这个表达式的值是1,减一是后缀,先使用变量再计算表达式,假设i的值是5,i--的值就还是5,而第2个i变为了4,结果就是1.但是这个赋值结果变为0还是很难理解,不知道为什么,等高人.
[/Quote]

int main()
{
int i = 5;
int j = 5;
cout << i---i;
j = i---i;
cout << j;
return 0;
}

经过vc6.0 gcc测试 都是输出00
不知道你的编译器是啥.
也可能是编译器优化导致不同.
LoneLock 2008-09-20
  • 打赏
  • 举报
回复
我用上面的程序,TC的结果就是1.
LoneLock 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ATMSAM 的回复:]
测试了都等于0
[/Quote]
你怎么测试的?


void main()
{
int i=3;
printf("%d\n",i---i);
}

是0还是1?
OenAuth.Core 2008-09-20
  • 打赏
  • 举报
回复
我们的机器一般都是0 0
OenAuth.Core 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 Aloneloop 的帖子:]
今天看到某论坛有人问这么一个问题
i,j都是整型变量.
打印输出i---i的值是1,而如果把i---i赋值给j,打印输出j的值就是0,这是为什么?
[/Quote]

那看来那位仁兄的电脑是这么运算的:
直接打印的时候是:i-(--i)=1
赋值的时候是j=(i--)-i=0
rock_HX 2008-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coding_hello 的回复:]
不能够。 i-- -i 总是0
[/Quote]
正确.
i-- -i 中没有顺序点,也就是i-- 要语句结束后才发挥作用..

我在vc2005里测试lz说的两种情况都是0

代码:

#include <iostream>
#include <stdio.h>

int main()
{
int n = 5;
printf("%d", n---n);

n = 5;
int j = n --- n;
printf("%d", j);
system("pause");
return 0;
}
加载更多回复(9)

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧