hardman
V2EX  ›  问与答

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

  •  
  •   hardman · Jan 5, 2018 · 4325 views
    This topic created in 3226 days ago, the information mentioned may be changed or developed.

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

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

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

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

    只能这么解释了。我知道 cout 底层是个异步进程管道,不知道 printf 底层是什么。
    watzds
    watzds
    Jan 5, 2018 via Android
    17
    这个和 printf 没关系
    binxin
    binxin
    Jan 5, 2018
    18
    感觉 ++i,i++,i,不能在同一行共存。
    ini
    ini
    Jan 5, 2018
    19
    @geelaw #11 soga,又涨姿势了
    ini
    ini
    Jan 5, 2018
    20
    https://stackoverflow.com/a/367663/1256392 这里有详细讲,是 UB,但不是 undefined behavior,而是 unspecified behavior
    geelaw
    geelaw
    Jan 5, 2018 via iPhone
    21
    @limhiaoing 没有规定是 unspecified/implementation-defined,但总是会计算并调用的; undefined 是说编译器可以有任意行为的。
    700388
    700388
    Jan 5, 2018
    22
    vc 的 g++ 和 vs 的 g++版本不同造成差异化。 如果都是一样版本则没有这样的错误。
    用最新版本的 g++ 才是首选。
    jjianwen68
    jjianwen68
    Jan 5, 2018
    23
    加几个括号,声明几个变量,死不了人的
    limhiaoing
    limhiaoing
    Jan 5, 2018 via iPhone
    24
    @ini
    @geelaw
    了解!
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1878 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 16:36 · PVG 00:36 · LAX 08:36 · JFK 11:36
    ♥ Do have faith in what you're doing.