V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hardman
V2EX  ›  问与答

请问下 c 和 c++的 printf 是不一样的吗

  •  
  •   hardman · 2018-01-05 10:53:39 +08:00 · 3386 次点击
    这是一个创建于 2543 天前的主题,其中的信息可能已经有所发展或是发生改变。

    用 vc++编写 printf (“%d%d%d ”,a,++a,++a );a 等于 5 输出结果是 5,6,7 用 vs 编译的时候 776 这个是使用的 c 标准不一样嘛

    24 条回复    2018-01-05 17:39:09 +08:00
    am241
        1
    am241  
       2018-01-05 10:58:12 +08:00
    从左到右和从右到左,调用约定不一样吧
    caviar
        2
    caviar  
       2018-01-05 11:00:03 +08:00 via Android   ❤️ 1
    这个是 ub 啊,同样是 c 你换个编译器都有可能不一样
    QAPTEAWH
        3
    QAPTEAWH  
       2018-01-05 11:01:13 +08:00   ❤️ 4
    ++你大爷
    ini
        4
    ini  
       2018-01-05 11:06:10 +08:00 via iPhone
    搜索 stdcall 和 cdecl
    kyotrue
        5
    kyotrue  
       2018-01-05 11:08:26 +08:00
    编译器处理的区别吧,话说讲真有这么写程序的么。。。
    kyotrue
        6
    kyotrue  
       2018-01-05 11:09:12 +08:00
    @ini 都是从右到左入栈的
    b821025551b
        7
    b821025551b  
       2018-01-05 11:14:31 +08:00   ❤️ 2
    请扔掉那本谭浩强。
    Carseason
        8
    Carseason  
       2018-01-05 11:18:21 +08:00 via iPhone   ❤️ 1
    谭浩强害了多少学 C 的孩子.
    XiaoXiaoNiWa
        9
    XiaoXiaoNiWa  
       2018-01-05 11:37:05 +08:00 via Android
    这个问题没有意义。
    永远不要这样写代码。
    chuckzhou
        10
    chuckzhou  
       2018-01-05 11:49:18 +08:00
    你写这种代码的目的是什么呢?解决什么问题?
    geelaw
        11
    geelaw  
       2018-01-05 12:25:32 +08:00 via iPhone   ❤️ 1
    @am241
    @ini
    @kyotrue

    和入栈顺序没关系,不一定非要按照入栈顺序计算参数,甚至可以选择随机一个顺序来计算。
    we2ex
        12
    we2ex  
       2018-01-05 12:32:36 +08:00 via Android
    C 语言的未定义行为
    kyotrue
        13
    kyotrue  
       2018-01-05 12:40:45 +08:00
    @geelaw 所以我说了是看编译器怎么处理
    这种问题也就只能出现在面试题中了,还有冷门运算符的优先级问题,实际工作谁这么写。。。
    kamen
        14
    kamen  
       2018-01-05 12:44:35 +08:00 via Android
    永远不要这样写代码,会被打的。
    limhiaoing
        15
    limhiaoing  
       2018-01-05 13:02:53 +08:00 via iPhone   ❤️ 1
    C 和 C++都没有规定参数的求值顺序,所以这段代码是 UB ( undefined behavior )。
    northisland
        16
    northisland  
       2018-01-05 13:18:20 +08:00 via iPhone
    这样看来,确实是不一样的。

    c++编译器连接器,会把 c 中不存在的语言特性变成机器码。而对于 c 中存在的可编译的部分,楼主的 c++工具显然并没直接使用 c 生成的机器码。

    只能这么解释了。我知道 cout 底层是个异步进程管道,不知道 printf 底层是什么。
    watzds
        17
    watzds  
       2018-01-05 13:27:32 +08:00 via Android
    这个和 printf 没关系
    binxin
        18
    binxin  
       2018-01-05 13:29:31 +08:00
    感觉 ++i,i++,i,不能在同一行共存。
    ini
        19
    ini  
       2018-01-05 13:38:15 +08:00
    @geelaw #11 soga,又涨姿势了
    ini
        20
    ini  
       2018-01-05 13:45:02 +08:00
    https://stackoverflow.com/a/367663/1256392 这里有详细讲,是 UB,但不是 undefined behavior,而是 unspecified behavior
    geelaw
        21
    geelaw  
       2018-01-05 14:10:31 +08:00 via iPhone
    @limhiaoing 没有规定是 unspecified/implementation-defined,但总是会计算并调用的; undefined 是说编译器可以有任意行为的。
    700388
        22
    700388  
       2018-01-05 15:26:38 +08:00
    vc 的 g++ 和 vs 的 g++版本不同造成差异化。 如果都是一样版本则没有这样的错误。
    用最新版本的 g++ 才是首选。
    jjianwen68
        23
    jjianwen68  
       2018-01-05 15:40:18 +08:00
    加几个括号,声明几个变量,死不了人的
    limhiaoing
        24
    limhiaoing  
       2018-01-05 17:39:08 +08:00 via iPhone
    @ini
    @geelaw
    了解!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2856 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:47 · PVG 20:47 · LAX 04:47 · JFK 07:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.