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

一道 C 语言 printf 的经典题目

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

    下列程序,输出结果?

    #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   ·   实用小工具   ·   2730 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 08:53 · PVG 16:53 · LAX 00:53 · JFK 03:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.