搜索
查看: 1733|回复: 19
打印 上一主题 下一主题

大神们来解释下这个奇葩的语句。

[复制链接]
楼主
发表于 2014-7-22 08:38:09 | 显示全部楼层
rosynirvana 发表于 2013-12-31 12:08
首先要明白,并非所有能通过编译的代码都是正确的代码
这种时点有问题的代码,gcc会给警告的
我强烈推荐 ...

我个人理解:

像自增自减这类的表达式,他原先的设计思想是简化程序,而不是像楼主举例的把程序复杂化。

i++,一个表达式隐含了两种含义,也即两个计算动作,两个计算动作必定有先后顺序,所以单独为简化程序而诞生,所以应用时要注意。写程序应当以别人和自己易懂的方式准确、清晰的表达。
沙发
发表于 2014-7-22 10:06:26 | 显示全部楼层
rosynirvana 发表于 2014-7-22 09:34
可惜国内考试喜欢考这种东西
而且出题人自己也不知道是标准中怎么规定的

看了你关于自增的解释,第一次知道了程序执行的时序问题,以及语句执行的时序。

i++; ++i 在后面没有 ';' 符号的时候可能会产生不了动作。
板凳
发表于 2014-7-22 11:10:36 | 显示全部楼层
rosynirvana 发表于 2014-7-22 10:13
时序点不只有分号有
例如&&也有
j = i ++ && -- i;

时序点不只有分号有
例如&&也有
j = i ++ && -- i;  

逗号表达式的逗号也有
j = i++, --i, ++i, i--;

------->这两例题算是运算符的优先级别问题;还是计算动作的时序问题?


但是作为参数分割的冒号就没有,例如主楼-------->应该说逗号吧?
例如printf("%d %d", i++, --i);
地板
发表于 2014-7-22 14:04:40 | 显示全部楼层
本帖最后由 嗨,强哥! 于 2014-7-22 14:06 编辑
rosynirvana 发表于 2014-7-22 11:17
时序问题,对比一下就知道了

j = i++ && --i;不会有问题

[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
int main()
{
    int j, k, i= 1;
    j = --i && i++;
    k = (i++) + (--i);
    printf ("%d  %d  ", j, k);      //运算结果:0 -2
    system("pause");
    return 0;
}
[/mw_shl_code]
5#
发表于 2014-7-22 16:18:01 | 显示全部楼层
rosynirvana 发表于 2014-7-22 16:01
j是0没问题
k那句是未定义的

嗯,程序验证你说的是正确的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表