趣味题

我当老师的姑姑,还真的是经常跑来问一些奇奇怪怪的题,但是好歹当年大学也是班里打基础实力军之一,来分享一下:

题目:已知 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语言吧。

猜你喜欢

转载自www.cnblogs.com/sylvialucy/p/12753614.html
今日推荐