我当老师的姑姑,还真的是经常跑来问一些奇奇怪怪的题,但是好歹当年大学也是班里打基础实力军之一,来分享一下:
题目:已知 int a = 6; 则执行 a + = a - = a * a; a的值为()
答案还是简单的: -60
但是具体如何得来,可能大家都不一定清楚了,简单的分析一下。
从面向过程的语言角度来谈这道题,需要注意以下两点:
1.运算符的结合性
2.数据改动的时间点
题中重点运算符 ‘=’ , 该运算符的结合性是右结合的,且数据改动的时间点就在‘=’ 赋值时。
一开始 a = 6;
因为‘=’的右结合性,先计算后半部分的赋值: a - = a * a;
即a = 6 - 6 * 6 = -30
这一步结束后,a被赋值为-30;
在看左边的'=';
a + = ();
即a = -30 + -30;
最终 a = -60;
再细一点解释一下a 为什么在赋值前后值变化了;
计算机在计算时,a的值即数据的地址;
实际的运算过程,是通过将变量a的值赋值给通用寄存器来运算;
寄存器在计算时并不会影响a变量的值,即a变量的值还是 为 6;
但是计算完毕后,计算机会将计算结果再写到a变量的位置,即涂改掉6 变成了 -30 (运算符‘-’的作用);
此时再去进行下一步计算,需要重新再获取a变量的值。
(划重点:计算机底层运算单次最多一个计算,即数据丢到寄存器,进行一次运算,再把结果丢回该存在的地方。ps: 这种说法是针对面向过程的语言封装的汇编语言,汇编语言自己当然是任意时间读取数据,多次运算的)
所以通过这道题,可以了解运算符结合性,运算过程中值什么时候发生变化这两点。
语言那么多,我哪里能保证我说的一定是对的= =, 那就针对c语言吧。