c / c++ 中的未定义行为

c / c++ 编程当中会遇到一些未定义的行为

这些行为多数和c/c++标准当中的定义不明确有关系

第一种,操作数的执行顺序

标准当中,只有四个操作数有过明确的执行顺序:

      逻辑运算符&&和||   从左到右,短路测试

      ?:条件运算符  先执行?前面的表达式

       逗号运算符,从左到右

其他的运算符,都没有定义执行顺序,也就是说  v = f1()+f2()这个表达式,f1()和f2()谁先执行是未定义的

例如:  v = (++i )/ (--i) ; 

              v = a[++i][++i];      没有定义两个[]里面的表达式的先后执行顺序

 

二. 多参数的函数

   多参数函数,比如func(par1, par2) 

   当par1和par2是两个表达式的时候,par1和par2谁先执行是没有定义的

   当然,执行的结果,是右侧的参数先入栈,左侧的后入栈,这是有明确定义的

   printf("%d %d",  ++i, ++i);

 

三 涉及到中间变量的行为

典型的就是i++这种

比如: i = i++;

i++ 先返回i的值,再自增。 但是这里并没有定义这个自增后对自身复制的先后顺序

i = ++i 就没有这个问题

 

四 其他情况,待整理

前面三种都是未定义顺序的行为, 其他的未定义的行为肯定还有,有待进一步的搜集整理分类:

    比如long到底是多少位的,在不同的操作系统和编译器也不一样,可能归咎于编译器的行为更贴切

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值