一个奇怪问题

anlun 2014-09-04 03:19:40
int i=1;
if(i++==++i)
{
printf("ok1\r\n");
}
if(++i==i++)
{
printf("pk2\r\n");
}
为何两个ok都打印出来了意思及 i++==++i ++i==i++
...全文
375 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
pclvmm 2014-09-12
  • 打赏
  • 举报
回复
远离啊远离 LZ保重
lizadana 2014-09-11
  • 打赏
  • 举报
回复
考试这个就是孔乙己回字有第四种写法罢了。
轩宇曦 2014-09-11
  • 打赏
  • 举报
回复
可能其他人已经有正确答案了,我简单说一下:首先优先级++ > ==,所以 两个判断条件里最终进行==判断的时候,左右两边都是 i的值(是同一块内存的值),所以不管前缀还是后缀,==的运算结果都为真
superdai 2014-09-11
  • 打赏
  • 举报
回复
这。。。。看到这种感觉真的是晕啊。
cao_julians 2014-09-11
  • 打赏
  • 举报
回复
LZ的问题是“副作用”范畴的----任何层次的程序员都不要纠结这种东西----楼上有人建议过了。 这种东西从哪里来的,是书就换一本,是老师就拒绝回答----关爱生命、珍惜青春
赵4老师 2014-09-11
  • 打赏
  • 举报
回复
aa5566f4 2014-09-10
  • 打赏
  • 举报
回复

#include <stdio.h>
void main()
{
	int i = 1;
	int j = 1;              //需要定義兩個變數
	if(i++ == ++j)
	{
		printf("ok1\r\n");
	}
	if(++i == j++)
	{
		printf("ok2\r\n");
	}

	if(i++ == ++j)
	{
		printf("ok1\r\n");
	}
	if(++i == ++j)
	{
		printf("ok3\r\n");
	}
}
因該要定義兩個變數 打印出結果為 ok3 應該就是你想要的吧
Moyu18_06_12 2014-09-07
  • 打赏
  • 举报
回复
前置++和后置++的运算优先级比==要高
  • 打赏
  • 举报
回复
每行i的值都是i的值
yulitingfeng 2014-09-05
  • 打赏
  • 举报
回复
刚接触的c的时候总觉得搞懂这些东西很有必要。现在看到这样的问题直接忽视,谁写这样的代码,直接毙掉
竹影半墙 2014-09-04
  • 打赏
  • 举报
回复
x86/debian gnu linux/gcc 0804840c <main>: #include <stdio.h> int main(void) { 804840c: 55 push %ebp 804840d: 89 e5 mov %esp,%ebp 804840f: 83 e4 f0 and $0xfffffff0,%esp 8048412: 83 ec 20 sub $0x20,%esp int i=1; 8048415: c7 44 24 1c 01 00 00 movl $0x1,0x1c(%esp) 804841c: 00 if(i++==++i) 804841d: 83 44 24 1c 01 addl $0x1,0x1c(%esp) 8048422: 8b 44 24 1c mov 0x1c(%esp),%eax 8048426: 3b 44 24 1c cmp 0x1c(%esp),%eax 804842a: 0f 94 c0 sete %al 804842d: 83 44 24 1c 01 addl $0x1,0x1c(%esp) 8048432: 84 c0 test %al,%al 8048434: 74 0c je 8048442 <main+0x36> { printf("ok1\r\n"); 8048436: c7 04 24 00 85 04 08 movl $0x8048500,(%esp) 804843d: e8 ae fe ff ff call 80482f0 <puts@plt> } if(++i==i++) 8048442: 83 44 24 1c 01 addl $0x1,0x1c(%esp) 8048447: 8b 44 24 1c mov 0x1c(%esp),%eax 804844b: 3b 44 24 1c cmp 0x1c(%esp),%eax 804844f: 0f 94 c0 sete %al 8048452: 83 44 24 1c 01 addl $0x1,0x1c(%esp) 8048457: 84 c0 test %al,%al 178,23-29 65% 8048459: 74 0c je 8048467 <main+0x5b> { printf("pk2\r\n"); 804845b: c7 04 24 05 85 04 08 movl $0x8048505,(%esp) 8048462: e8 89 fe ff ff call 80482f0 <puts@plt> } return 0; 8048467: b8 00 00 00 00 mov $0x0,%eax } 804846c: c9 leave 804846d: c3 ret LC编程一站式学习 --宋劲杉 P.253 P.236
707wk 2014-09-04
  • 打赏
  • 举报
回复
引用 3 楼 cyd54454 的回复:
不要用这样的表达式,这结果是未定义的,也就是依赖编译器的具体实现。编程本就该避免这些未定义的行为
+1,但为什么考试总喜欢靠这些
starytx 2014-09-04
  • 打赏
  • 举报
回复
建议不用过多纠结这种东西,看看置顶那个帖子
freecodex 2014-09-04
  • 打赏
  • 举报
回复
楼上几位都说了,实现取决于编译器 VS反汇编:
	int i=1;
00E413BE  mov         dword ptr [i],1 

	if(i++==++i)
00E413C5  mov         eax,dword ptr [i] 
00E413C8  add         eax,1 
00E413CB  mov         dword ptr [i],eax 
00E413CE  mov         ecx,dword ptr [i] 
00E413D1  mov         edx,dword ptr [i] 
00E413D4  mov         eax,dword ptr [i] 
00E413D7  add         eax,1 
00E413DA  mov         dword ptr [i],eax 
00E413DD  cmp         ecx,edx               // 这两 比较的是eac = edx = 2              
00E413DF  jne         wmain+4Dh (0E413EDh) 
00E413E1  mov         dword ptr [ebp-0D0h],1 
00E413EB  jmp         wmain+57h (0E413F7h) 
00E413ED  mov         dword ptr [ebp-0D0h],0 
00E413F7  cmp         dword ptr [ebp-0D0h],0 
00E413FE  je          wmain+77h (0E41417h) 
cyd54454 2014-09-04
  • 打赏
  • 举报
回复
不要用这样的表达式,这结果是未定义的,也就是依赖编译器的具体实现。编程本就该避免这些未定义的行为
  • 打赏
  • 举报
回复
引用 楼主 anlun 的回复:
int i=1; if(i++==++i) { printf("ok1\r\n"); } if(++i==i++) { printf("pk2\r\n"); } 为何两个ok都打印出来了意思及 i++==++i ++i==i++
这就是 编译器计算顺序的问题 第一个 i++ 的值是2 而i = 1;后面 ++i = 2 ,i的值也是2 所以相等的。 第二个++i 的是2 而i = 2;后面先取i的值是2 ,再进行++运算。所以也想等!
lm_whales 2014-09-04
  • 打赏
  • 举报
回复
这很正常 1) 这个表达式可能有这样几种处理方式 if(i++ == ++i) s;=======> // if(i==i){ s; i ++ ,++i;} //OK 或者 =======>// if(i==i){ s; i ++ ,++i;} //OK 或者 =======> if(i++,i==++i)s; // if(i++,i==++i)s; 可以理解为 ====> if(i++ ,i==i){++i;s;} //OK 或者 if(i++ ,i==i){s;++i;} //OK 或者 if(i++,++i ,i==i){s;} //OK 或者 if(t=i++,t1=++i,t==t1)s; // 这个不OK if(++i == i++ )s;=======> // if(++i,i==i++) s; //OK 或者 if(t=++i,t1=i++,t==t1)s; // 这个不OK 这里对i有两次副作用,C,C++没有规定副作用的实现时机 PS: 其实讨论这个没有意义。

69,373

社区成员

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

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