/***********************************************************/
/* 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
阅读(1568) | 评论(0) | 转发(0) |