一道 C 语言 printf 的经典题目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
donglongtu
V2EX    Linux

一道 C 语言 printf 的经典题目

  •  
  •   donglongtu 2017-07-01 22:12:46 +08:00 6163 次点击
    这是一个创建于 3032 天前的主题,其中的信息可能已经有所发展或是发生改变。

    下列程序,输出结果?

    #include <stdio.h> int main() { int i = 43; printf("%d\n",printf("%d",printf("%d",i))); return 0; } 

    原系列出处:Linux 下 C 语言的几道经典面试题

    31 条回复    2017-07-03 09:20:19 +08:00
    waycool
        1
    waycool  
       2017-07-01 22:31:53 +08:00   1
    4321
    21grams
        2
    21grams  
       2017-07-01 23:04:11 +08:00   1
    有啥经典的
    ldbC5uTBj11yaeh5
        3
    ldbC5uTBj11yaeh5  
       2017-07-01 23:05:26 +08:00
    来来来,自认 c/c++ 面霸们的试试这个 /t/370278#r_4451518
    darrenliuwei
        4
    darrenliuwei  
       2017-07-01 23:24:04 +08:00
    @waycool 结果为什么会是 4321 啊?
    darrenliuwei
        5
    darrenliuwei  
       2017-07-01 23:25:00 +08:00
    @waycool 我运行了,结果确实是 4321,但是不明白为什么会是 4321 ?
    markx
        6
    markx  
       2017-07-01 23:27:37 +08:00
    @darrenliuwei 你查一查 printf 的返回值就明白了呀。
    Cooky
        7
    Cooky  
       2017-07-01 23:27:45 +08:00 via Android
    @darrenliuwei printf 返回打印的字符串长度吧
    k9982874
        8
    k9982874  
       2017-07-01 23:28:14 +08:00 via iPad   2
    有啥经典的?测试答题者熟不熟悉 printf 函数?
    low 的不行
    zonyitoo
        9
    zonyitoo  
       2017-07-01 23:29:58 +08:00
    man 一下 printf 不就知道了,这问题纯粹就是看你有没有认真读过 printf 的函数文档罢了
    feather12315
        10
    feather12315  
       2017-07-01 23:31:23 +08:00 via Android
    @darrenliuwei 一个命令:gcc -S
    换个字面的解释:AMD64 指令集,函数调用过程:第一、2 个参数,mov 到某个寄存器,rax 放系统调用号? 再 syscall。
    printf 第一个参数就是那个"%d",第二个参数呢?:)
    ldbC5uTBj11yaeh5
        11
    ldbC5uTBj11yaeh5  
       2017-07-01 23:32:02 +08:00
    printf 比较经典面试题是 EMC 的某道校招题,和 fork 集合起来考察缓冲区的理解。比较不错。

    至于楼主这道,小学生。
    CEBBCAT
        12
    CEBBCAT  
       2017-07-02 03:33:38 +08:00 via Android
    这题,考察的是执行顺序与返回值?
    20015jjw
        13
    20015jjw  
       2017-07-02 04:23:44 +08:00 via Android
    给大佬们跪了...
    misaka20038numbe
        14
    misaka20038numbe  
       2017-07-02 06:39:09 +08:00
    printf 返回值是 int,我看函数声明这样写
    ogfa
        15
    ogfa  
       2017-07-02 06:49:55 +08:00   1
    就从这种帖子就能看出来这里的都是些什么水平的货色
    小学生真是高看它了

    回你的贴都是对人的一种侮辱
    lechain
        16
    lechain  
       2017-07-02 08:43:32 +08:00
    看这里 https://linux.die.net/man/3/printf
    或者在自己的电脑上这样子
    ```
    cat /usr/include/stdio.h | grep printf
    extern int fprintf (FILE *__restrict __stream,
    extern int printf (const char *__restrict __format, ...);
    extern int sprintf (char *__restrict __s,

    ```

    看第三行, 有返回值的
    lechain
        17
    lechain  
       2017-07-02 08:45:34 +08:00
    man 手册里面对返回值的说明具体是这句话

    Upon successful return, these functions return the number of characters printed (excluding the null byte used to end output to strings).
    Shura
        18
    Shura  
       2017-07-02 09:40:37 +08:00 via Android
    还不如这样考,printf("%d\n",printf("%d",scanf("%d%d",&a,&b)));
    sergeant
        19
    sergeant  
       2017-07-02 10:00:21 +08:00
    别鄙视楼主了,至少我这个小学生学到了
    coderluan
        20
    coderluan  
       2017-07-02 10:26:19 +08:00
    如果用了现实中不会出现的写法,那么这道题就提到不什么经典。
    Yunhao
        21
    Yunhao  
       2017-07-02 10:58:13 +08:00 via iPhone   3
    为什么有些人的回复总喜欢充满恶意
    baixiangcpp
        22
    baixiangcpp  
       2017-07-02 11:31:05 +08:00
    看不出哪里经典了,挺无聊的题目
    hjc4869
        23
    hjc4869  
       2017-07-02 11:47:26 +08:00 via iPhone
    int x=100;
    printf("%d");

    32bit msvc cl -O0 编译
    输出?
    LigeLaige
        24
    LigeLaige  
       2017-07-02 12:17:14 +08:00
    printf 簇函数 ( printf/sprintf/fprintf ) 返回打印的字符串的长度
    printf "43" 返回长度 2, "2" 返回长度 1 (延伸:"1" 还是返回 1 )

    所以 console 里面看到的是 4321,可以分开看:先打印 43,然后打印 2,然后打印 1,如果在调一层,就还是 1 ( 43211 )。
    momocraft
        25
    momocraft  
       2017-07-02 12:44:00 +08:00
    第一次看错了, 以为是考参数计算顺序 (ub) 的
    shiji
        26
    shiji  
       2017-07-02 12:50:23 +08:00 via Android
    这是在刷 seo 么,我记得今天在 segment fault 看见过一模一样的东西。
    21grams
        27
    21grams  
       2017-07-02 13:08:30 +08:00
    回字有四种写法,你们都学到了吗?
    besto
        28
    besto  
       2017-07-02 14:34:31 +08:00
    我来出一道题吧,关于 printf 的。
    #include <stdio.h>
    int main(){
    int n = 0;
    printf("HELLO %d\n%n", n, &n);
    printf("%d\n", n);
    return 0;
    }
    Vfeather
        29
    Vfeather  
       2017-07-02 22:25:37 +08:00
    不是很理解。
    jeffersonpig
        30
    jeffersonpig  
       2017-07-03 09:08:51 +08:00
    写了几年 C/C++从来没用过 printf 的返回值……
    araraloren
        31
    araraloren  
       2017-07-03 09:20:19 +08:00
    @jigloo 不错 我还真不知道 sizeof('a') 在 c 和 c++ 里面竟然不一样。。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     812 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 20:56 PVG 04:56 LAX 13:56 JFK 16:56
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86