C语言表达式的结合律问题:从右向左结合是什么意思?
比如说++、--(前置/后置)的结合律是从右向左,具体是如何结合的?另外,关于以下操作:inta,b;a=b=1;intc=(a++)+(a++)+(a++);intd=...
比如说++、--(前置/后置)的结合律是从右向左,具体是如何结合的?
另外,关于以下操作:
int a,b;
a=b=1;
int c=(a++)+(a++)+(a++);
int d=(++b)+(++b)+(++b);
在VC里结果为a=4,b=4,c=3,d=10;
面在C++BUILDER里结果为a=4,b=4,c=3,d=12;
为何d的值在不同的环境中运行结果会不一样?请高人指教。 展开
另外,关于以下操作:
int a,b;
a=b=1;
int c=(a++)+(a++)+(a++);
int d=(++b)+(++b)+(++b);
在VC里结果为a=4,b=4,c=3,d=10;
面在C++BUILDER里结果为a=4,b=4,c=3,d=12;
为何d的值在不同的环境中运行结果会不一样?请高人指教。 展开
展开全部
c++标准对子表达式进行求值的次序没有做出规定,由各个c++编译器厂商自己决定(参见Bjarne Stroustrup所著的C++程序设计语言)。因此,开发人员不要编写依赖子表达式执行次序的代码,因为为了实现同样的功能,完全可以采用更为清晰的代码!
例如,语句int c=(a++)+(a++)+(a++);中给c赋值的表达式(a++)+(a++)+(a++)的求值,语义上想表达什么?这样的代码本身存在问题,编写的目的是为了提高效率?提高了吗?
如果确实想钻研,那么根据Bjarne Stroustrup所说的“子表达式求值次序”,枚举各种可能,就可以理解所有不同结果的编译器行为。例如,上述语句int d=(++b)+(++b)+(++b);可以概念上表示为:int d=E1+E2+E3;(其中,E1,E2,E3是+运算符的同层次表达式,(E1+E2)和E3是+运算符的同层次表达式),其它同层次表达式可以同理)则其计算次序可以是
1)E1(此时b=2)=>E2(此时b=3)=>E1+E2=b+b=6放入中间变量(此时b=3)=>E3
(此时b=4)=>d=10 对应VC的结果
2)E1(此时b=2)=>E2(此时b=3)=>E3(此时b=4)=>E1+E2=b+b放入中间变量(此时b=4)=>d=12 对应BC的结果;
例如,语句int c=(a++)+(a++)+(a++);中给c赋值的表达式(a++)+(a++)+(a++)的求值,语义上想表达什么?这样的代码本身存在问题,编写的目的是为了提高效率?提高了吗?
如果确实想钻研,那么根据Bjarne Stroustrup所说的“子表达式求值次序”,枚举各种可能,就可以理解所有不同结果的编译器行为。例如,上述语句int d=(++b)+(++b)+(++b);可以概念上表示为:int d=E1+E2+E3;(其中,E1,E2,E3是+运算符的同层次表达式,(E1+E2)和E3是+运算符的同层次表达式),其它同层次表达式可以同理)则其计算次序可以是
1)E1(此时b=2)=>E2(此时b=3)=>E1+E2=b+b=6放入中间变量(此时b=3)=>E3
(此时b=4)=>d=10 对应VC的结果
2)E1(此时b=2)=>E2(此时b=3)=>E3(此时b=4)=>E1+E2=b+b放入中间变量(此时b=4)=>d=12 对应BC的结果;
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询