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到底是多少位的,在不同的操作系统和编译器也不一样,可能归咎于编译器的行为更贴切