• 表达式之运算顺序与求值顺序

    • C/C++中的情况

    写这篇水文的缘由是技术群里的一个同学提出的问题,可能是什么笔试题目吧!内容很简单,求表达式(++a) + (++a) + (a++)的值,其中a=5。对于这个问题,估计大部分同学都会给出20这个答案,我也是这么想的。在Java中,这个表达式的答案也确实是20。可惜这个题目的背景是C/C++,问题好像不是那么简单了,VC6给出的答案是22。开始我没有仔细算,猜测是C/C++在处理算术表达式的时候使用了某种自顶向下的文法。为了消除左递归,表达式求值的时候是按照从右到左的顺序处理的。但是,这样也不能解释VC6给出的答案,这种求值顺序的答案应该是21才对。

    理论分析吃瘪,我决定还是看看汇编吧!我先在GCC下做了个简单的实验,结果是21。反汇编的结果如下:

    image

    乍一看结果21,可能有人会认为这个结果的计算过程是6 + 7 + 8。到底是什么样,看汇编便知,… 【查看更多】

  • Android开发中的一些零散纪录

    最近一段时间,主要是在解一些bug,所以精力都分散在了不同的问题上。也是很久一段时间没有写blog了,这里记录一下最近debug过程中的一些知识点。

    1. 使用CircleImageView时,Glide第一次无法加载出正常的图片

    这个 bug的具体原因,我还不太清楚,留到以后再探讨了。后来参考StackOverflow上的回答解决了问题。主要的代码片段如下

    Glide.with(this.getApplicationContext())
    .load(url)
    .asBitmap()
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .placeholder(R.drawable.default_avatar)
    .into(new SimpleTarget<Bitmap>() {
    @Override
    public void onResourceReady(Bitmap
    【查看更多】
  • Java的字符编码

    想到这个问题的缘由是如下这段代码:

        String inputStr = "abc";
        byte[] input = inputStr.getBytes();
        System.out.println(input.length);
    

    按照我的常识,Java的String类使用的是utf-16编码。在BMP平面的字符都是可以使用两个字节表示的,四个字节的情况并不常见。对于例子中的inputStr,它应该占用六个字节的存储空间。但是这段程序的执行结果是3。

    这是为什么呢?原来String类还有一个getBytes(String charset)方法。直接调用String.getBytes()相当于调用String.getBytes(Charset.getDefaultCharset())。在中文操作系统下,一般的默认编码都是GBK。

    首先需要明确的是,中文编码GB18030GBKGB2312ASCII,这里的大于号是兼容包含的含义。在三个中文编码标准中,除了128个ASCII是一个字节外,其他都是两个字节。所以中文编码严格算来也是变长编码格式。然而这些中文… 【查看更多】