Chinaunix首页 | 论坛 | 博客
  • 博客访问: 305667
  • 博文数量: 54
  • 博客积分: 3050
  • 博客等级: 中校
  • 技术积分: 601
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-25 16:53
文章分类
文章存档

2012年(1)

2011年(7)

2010年(46)

我的朋友

分类: LINUX

2010-03-03 20:28:23

/***********************************************************/
/*    Copyright @ 2010 shepherd. All Rights Reserved.     */
/*                  *********** 转载请注明出处*********                */
/***********************************************************/

复习使用 printf 命令的时候想起来以前百毒知道看过的一个问题帖,好像是 printf(”\\\\\ \n");在 C 里面输出什么之类,但是用 printf \\\\\\\ (从 3 个到 7、8个)都试了一下却没有结果了,干脆做一下码农自己动手敲敲,其实也没有敲多少哈,然后下面就是有点晃眼的实验及结果:

猜测: \ 可以转义三次,每次连续出现的 \ 的数目整除4,得到的商就是会打印出来的结果。形式化描述:

猜测1:如果(printf 命令里)有 i = 4n + k 个 \ 连续出现,且 0 <= k <= 3。那么输出结果为  n 个 \ 后接1 个 \,即 n+1 个 \。其中 n  为一切自然数。

******************* test 1, start **************************

shepherd@zimo:~$ printf "\\ \n"
\
shepherd@zimo:~$ printf "\\\ \n"
shepherd@zimo:~$ printf "\\\\ \n"
shepherd@zimo:~$ printf "\\\\\ \n"
\\ 
shepherd@zimo:~$ printf "\\\\\\ \n"
\\ 
shepherd@zimo:~$ printf "\\\\\\\ \n"
\\ 
shepherd@zimo:~$ printf "\\\\\\\\ \n"
\\ 
shepherd@zimo:~$ printf "\\\\\\\\\ \n"
\\\ 
shepherd@zimo:~$ printf "\\\\\\\\\\ \n"
\\\ 
shepherd@zimo:~$ printf "\\\\\\\\\\\ \n"
\\\ 
shepherd@zimo:~$ printf "\\\\\\\\\\\\ \n"
\\\ 
shepherd@zimo:~$ printf "\\\\\\\\\\\\\ \n"
\\\\ 

********************** test 1, end. ***************************

好奇心又起,如果最后一个 \ 后紧跟着一个可被转义的字符,比如 n,会是怎样的输出呢?

********************* test 2, start. *************************
shepherd@zimo:~$ printf "\\n"

shepherd@zimo:~$ printf "\\\n"
\nshepherd@zimo:~$ printf "\\\\n"
\nshepherd@zimo:~$ printf "\\\\\n"
\
shepherd@zimo:~$ printf "\\\\\\n"
\
shepherd@zimo:~$ printf "\\\\\\\n"
\\nshepherd@zimo:~$ printf "\\\\\\\\n"
\\nshepherd@zimo:~$ printf "\\\\\\\\\n"
\\
shepherd@zimo:~$ printf "\\\\\\\\\\n"
\\
shepherd@zimo:~$ printf "\\\\\\\\\\\n"
\\\nshepherd@zimo:~$ 

************* test 2, end. *************

这次看上去有些晃眼了吧,不过我突然想起来一个方法,用以佐证我的猜测哈,就是给每一次同一作用范围内的 \ 染色,相邻的不同范围染色不同,所以看上去能清晰一些,然后说明个人的猜测。(立正~ 稍息~ 向后看齐! 就是你上面看到的结果)

****************** test 2 结果的解释, start ****************

好的,如果 test 1 的猜测假设为真的话,下面接着来看 test 2 中的输出:(在 test 2 里除了 printf 后 “” 内的红色部分,剩下的每行红色字符为上一次 printf 的输出。)如果觉得在上面的格式下还是看得你有点晃眼的话,那么请揉揉眼好继续重复看~~

猜测2.1: 当 n 前的 \ 少于四个的时候,每一种情况有各自的输出。大约是这样的:
\n     -----> 换行    // 正常的换行功能
\\n    -----> 换行    // 猜测第一个 \ 对第二个 \ 进行一次转义,被转义一次的 \ 仍然有转义功能。
\\\n   -----> \n       // 猜测,被转义过了的 \ 转义的 \ 开始没有转义功能。即只能递归一次。
\\\\n  -----> \n       // 同上,描述的话多一层 ”转义过的“ 这几个字~~

猜测2.2: 当 \ 数量多于 4 个时,即 4n + k(n  >= 1, 0 <= k <= 3)个,前 4n 个按照 test 1 中的猜测1输出 n 个 \, 余下 k 个参考 猜测2.1。

**************** test 2 结果的解释, end. *********************

我倒,真实闲的有空阿我。又试验了一下 \v 的输出,和 \n 的情况一致,其他的不做进一步试验了,那位仁兄有兴趣搞搞,务必告诉我下哈~

估计么,呃~ 这是个历史遗留问题,也就是 printf 命令解释器进行词法分析的时候,状态机转移的问题,学过编译原理的应该能想到大约是这么一点。(实现上,估计是在处理字符的 循环 以及起内部的 switch-case 语句在处理 \ 时的状态跳转上,搜了以下,前三个帖子没有看到有效的源码,先不去看了)。不过只是自己猜测哈,我又没看到源码,猜错了暂且就恕自己无罪~

先自己这么理解这,欢迎大侠路过指正。如果某天本人自己遇到情况让这些猜测站不住脚的话,再来修改。再那之前,此处猜测只做个人猜测用。路过的若因之被误导,本人现在此声明,概不负责哈~~~~

PS:至于在 c 语言里 printf 函数的表现,不知会不会和编译器的实现相关,遇到的时候再去动手,先偷懒下~


    shepherd
Web,Mar/3/2010

阅读(1535) | 评论(0) | 转发(0) |
0

上一篇:so, why called such a name?

下一篇:一期一会

给主人留下些什么吧!~~