user-0 提问: 一个奇怪问题

回复:
user: user-1
content: 远离啊远离 LZ保重

user: user-2
content: 考试这个就是孔乙己回字有第四种写法罢了。

user: user-3
content: 可能其他人已经有正确答案了，我简单说一下：首先优先级++ > ==,所以 两个判断条件里最终进行==判断的时候，左右两边都是 i的值（是同一块内存的值）,所以不管前缀还是后缀，==的运算结果都为真

user: user-4
content: 这。。。。看到这种感觉真的是晕啊。

user: user-5
content: LZ的问题是“副作用”范畴的－－－－任何层次的程序员都不要纠结这种东西－－－－楼上有人建议过了。 这种东西从哪里来的，是书就换一本，是老师就拒绝回答－－－－关爱生命、珍惜青春

user: user-6
content: http://bbs.csdn.net/topics/370153775

user: user-7
content: #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 應該就是你想要的吧

user: user-8
content: 前置++和后置++的运算优先级比==要高

user: user-9
content: 每行i的值都是i的值

user: user-10
content: 刚接触的c的时候总觉得搞懂这些东西很有必要。现在看到这样的问题直接忽视，谁写这样的代码，直接毙掉

user: user-11
content: 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

user: user-12
content: 引用 3 楼 cyd54454 的回复:不要用这样的表达式，这结果是未定义的，也就是依赖编译器的具体实现。编程本就该避免这些未定义的行为+1，但为什么考试总喜欢靠这些

user: user-13
content: 建议不用过多纠结这种东西，看看置顶那个帖子

user: user-14
content: 楼上几位都说了，实现取决于编译器 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)

user: user-15
content: 不要用这样的表达式，这结果是未定义的，也就是依赖编译器的具体实现。编程本就该避免这些未定义的行为

user: user-16
content: 引用 楼主 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 ，再进行++运算。所以也想等！

user: user-17
content: 这很正常 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: 其实讨论这个没有意义。