zoukankan      html  css  js  c++  java
  • 趣味题

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

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

  • 相关阅读:
    k8s 静态pod
    k8s pod资源配额对调度的影响
    mysql分库,动态数据库切换
    【转】 一个C#中的webservice的初级例子(二)
    【转】UpdatePanel 简单实例
    Linux远程mount文件系统
    【转】一个C#中webservice的初级例子(一)
    javascript读写文件
    SilverLight插件检测
    C#读写共享文件夹
  • 原文地址:https://www.cnblogs.com/sylvialucy/p/12753614.html
Copyright © 2011-2022 走看看