面试题求详解:int c=9; c=c++%5; 最后求c等于多少?附答案求详解,该怎么处理

面试题求详解:int c=9; c=c++%5; 最后求c等于多少?附答案求详解
今天面试碰到这样一个题, 有些不明白,请大家帮忙解释
面试原题

 读程序段,回答问题
int main(int argc,char *argv[])
{
int c=9,d=0;
c=c++%5;
d=c;
printf("d=%d\n",d);
return 0;
}
a) 写出程序输出
b) 在一个可移植的系统中这种表达式是否存在风险?why?


HR给出的答案是 
1.程序输出为: 5
2.存在风险,因为: 因为c=c++%5;这个表达式对c有两次修改,行为未定义,c的值不确定

我的疑惑:
我回家用eclipse 运行上面的代码 无论编译,运行多少遍   结果只有一个: 4  。     而不是 5  !!!
还有源码中开始不是有一行 int c = 9; ? 这个不是给 c指定了 类型是9 赋值为 9 么, 为什么却说行尾未定义???

请大家帮忙详细解答一下,谢谢了

------解决方案--------------------
是“行为未定义”,不是“行尾未定义”。。。

对于下面这句话的解释:
c=c++%5;

一些编译器会这么解读:
c%5 //是4
c=(c%5) //是4
c++ //变成5了

但是eclipse是这么解读的:
c%5 //是4
(c++) //作为一个表达式,这里c先被自增为5,但是表达式的结果还是4。
c=4; //把表达式再赋值给c,结果c又变回4咯~

所以在可移植系统中,代码千万不能写的太随便。 

------解决方案--------------------
类型是9 赋值为 9

类型是int...

c = c++ % 5;

c是9,c % 5 = 4, 将4赋给c(第一次赋值), 再c++(第二次赋值),c就等于5了...

第一次赋值 和 第二次赋值 到底哪次先执行,是不确定的,

如果第二次赋值先执行的话,

c是9, c % 5 = 4, 将c++, c = 10; 再将4赋给c, c就等于4了..
------解决方案--------------------
c=9 => c=c%5=4 => c++ (c=5),可能面试官是这么觉得,具体++跟c=c%5哪个先执行跟编译器有关
不过这种面试题也是真2,
------解决方案--------------------
2.存在风险,因为: 因为c=c++%5;这个表达式对c有两次修改,行为未定义,c的值不确定

lz都这么说了,呵呵,你的编译器给出的结果如果都不唯一的话,你肯定会哭。。。。。

未定义行为,是标准没给与定义,但不代表编译器的行为未定义,呵呵。每种编译器给出的行为规则肯定是一致的,不然。所有人都会哭了
------解决方案--------------------
我的思维得到的也是5,
不过我也不会写c=c++%5这样的表达式,总觉得可能会因为编译器不同而得到不同的答案,
但是c=d++这样的表达式我敢写。
其实连c=d++%5我都不敢写~~
------解决方案--------------------
应该跟编译器有关,编译的时候,有些编译器把“c++”放到给c赋值之前,有些放到给c赋值之后。
PS:个人感觉这个面试官水平还不行