C语言::90%的人都会出错的printf()函数实例 - 高小调博客

C语言::90%的人都会出错的printf()函数实例

printf函数,对于一个写C语言的人来说是最常见的函数。而我们对printf函数到底了解多少呢?接下来我们看几个实例来做个测验吧!

实例一

1
2
3
4
5
#include<stdio.h>
int main(){
    printf("%d",printf("%d",printf("%d",43)));
    return 0;
}

这段代码最终的输出结果是什么?

实例二

1
2
3
4
5
6
#include<stdio.h>
int main(){
    int i = 6;
    printf("%d,%d,%d,%d,%d",i,i++,i--,++i,--i);
    return 0;
}  

这段代码的输出结果又是什么?

实例三

1
2
3
4
5
#include<stdio.h>
int main(){
    printf("(How are You??)\n");
    return 0;
}

这段程序在VC6.0下执行结果是什么?

实例四

1
2
3
4
5
6
#include<stdio.h>
#include<string.h>
int main(){
    printf("%d",strlen("c:\test\car\art.txt"));
    return 0;
}

这段代码的输出结果真的是19吗?面试经常考的哦!

实例五

1
2
3
4
5
6
7
8
#include<stdio.h>
#include<string.h>
int main(){
    char str1[10]={0};
    char str2[]={'0','0','0','0'};
    char str3[10]={1};
    printf("%d,%d,%d",strlen(str1),strlen(str2),strlen(str3));
}

猜一猜这个输出又是什么?

实例一:输出结果及解读

1
输出结果为:4321

这个没什么好解释的,只要知道printf函数的返回值,就可以轻而易举的得到最终结果

实例二:输出结果及解读

1
输出结果为:6,6,6,6,5

这个实例比较复杂,请参考C语言::printf()函数功能、原型、用法及实例 红体字部分

但你以为事实就这么简单嘛?实际上并不是,这种代码的写法,不同编译器编译出来的输出结果都不一样(Dev-C++和VC6.0自行测试)

事实上这样写出的程序结果是不定的,因为这个函数的执行和程序的调用约定有关系,调用约定决定了程序执行参数的压线过程,而你如果看程序的 汇编代码,你会发现就是这样一句代码翻译的汇编代码逻辑都不相同。

所以这种代码,仅供娱乐,你我开心就好,就不要去深究它了!

实例三:输出结果及解读

1
输出结果为:(How are you]

诶?这个看上去好像比较神奇哦!其实它的原理与转义字符类似,只不过是另一种转义,它的名字为“三字母词”

详情,请百度“三字母词”,在此就不细说了。

实例四:输出结果及解读

1
输出结果为:16

不知道你算对了嘛?为什么是16不是19呢?

因为\t、\c、\a属于转义字符,而每个转义字符只占据一个字节,因此最终结果为16!

实例五:输出结果及解读

1
2
输出结果为:0,4,1 //VC6.0
输出结果为:0,12,1    //VS2010

第一个输出0,这个的原理是:字符'\0'的ascii码的10进制值是0。知道这个的话,我想聪明的你就可以想到答案了吧!

第二个为什么在VC6.0下输出4而在VS2010下输出12?

VC6.0下的编译器自动为四个‘0’字符的数组添加了‘\0’,因此输出值为4

而VS2010下的编译器没有自动添加‘\0’,strlen()函数找不到‘\0’,因此输出了随机数。

每天只需进步一点点!

上一篇:
下一篇: