learn some c++ in a hard way.

#include <iostream>
using namespace std;

bool func(char* m)
{
    *m = '4';
    return true;
}

int main()
{
    char c1 = '3';
    cout  << "a" << c1 << func(&c1) << c1 << "b" << endl;

    return 0;
}

just tell me what’s the output of this code.

This entry was posted in 日志. Bookmark the permalink.

17 Responses to learn some c++ in a hard way.

  1. wodesuck says:
    Google Chrome 25.0.1364.123 Android 4.0.4

    a314b?
    感觉挺合直觉的

  2. csslayer says:
    Firefox 20.0 GNU/Linux x64

    @wodesuck 错。这里会触发c++的unspecifed的行为,参见:
    http://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points

    c++ 函数参数的求值顺序是不固定的,取决于编译器

    对于这个具体的例子,假设我们把 operator << 重载的函数写作 op 那么这个的等价代码是 op(op(op(op(op(cout, "a"), c1), func(&c1), c1), "b"); 任意一个参数都可以先进行运算。 所以以下结果都有可能。 a314b a413b a313b a414b 我也是今天才知道……

  3. 右京样一 says:
    Firefox 19.0 GNU/Linux x64

    这好象是个经典的undefined案例……

    我是觉得应该避免为了压缩代码长度/偷懒/炫技从而破坏代码的工整性……

  4. Cruise Liu says:
    Firefox 19.0 GNU/Linux x64

    写表达式求值被 “if (ch == ‘-‘) return stack_pop() – stack_pop();” 这种东西坑过无数次之后已经学乖了…
    另外 g++ 编译出来的是 a413b

  5. t.k. says:
    Google Chrome 24.0.1312.70 GNU/Linux

    那么C语言呢?一定从右到左吗?

  6. yyc says:
    Chromium 24.0.1312.68 Arch Linux x64

    应该也一样吧…. (至少应该是即使标准里面规定了也最好不要依赖的那种…)

  7. fantasticfears says:
    Google Chrome 26.0.1410.19 GNU/Linux x64

    g++ 4.7.2: a413b
    clang 3.2: a314b
    标准没定义的其实就该当错误。。

  8. eventide says:
    Firefox 19.0 GNU/Linux x64

    cpp初学者…「直接被臭虐啊摔」

  9. Ma Xiaojun says:
    Google Chrome 25.0.1364.160 GNU/Linux x64

    cout那句一边修改c1一边读取c1的值,写这样的语句自然是玩火。

  10. wl says:
    Firefox 19.0 Windows 7 x64 Edition

    @Cruise Liu @Cruise Liu
    你说的那行代码咋了?

  11. yyc says:
    Chromium 24.0.1312.68 Arch Linux x64

    @wl “-“号前后的pop不一定哪个先求值….

  12. wl says:
    Firefox 19.0 Windows 7 x64 Edition

    @yyc 啊!!!!学习了!!!!

  13. wl says:
    Firefox 19.0 Windows 7 x64 Edition

    @yyc 那好比int a = f() – g(); 只要f和g有依赖就可能出错?

  14. yyc says:
    Chromium 24.0.1312.68 Arch Linux x64

    @wl 好像是的……

  15. wl says:
    Firefox 19.0 Windows 7 x64 Edition

    @yyc 那我终于明白了为啥stl里top和pop都要分开,还是有道理的。

  16. 平芜泫 says:
    Chromium 25.0.1364.160 Ubuntu x64

    @Cruise Liu

    其实 -O2 是 a414b。。。

  17. args says:
    Google Chrome 25.0.1364.172 GNU/Linux x64

    c++ primer 和 TCPL里面这个问题已经强调无数遍了……

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.