【C语言进阶剖析】13、接续符和转义符

mac2026-01-08  8

1 接续符

1.1 接续符的意义

C 语言中的接续符(\)是指示编译器行为的利器

下面通过一个例子感受一下接续符

//13-1.c #in\ clud\ e<st\ dio.h> in\ t m\ ain(\ ) { pri\ ntf\ (\ "Helo world!\n" )\ ; ret\ urn 0; }

上面的代码是合法的代码吗?我们编译一下看看 其实上面的代码就是打印一行 Helo world! 只不过将代码使用接续符变成了多行。

1.2 接续符的使用

有了上面对接续符的直观感觉,下面了解一下接续符的使用。

编译器会将反斜杠剔除,跟在反斜杠后面的字符自动接续到前一行在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格接续符适合在定义宏代码时使用

通过一个例子来说明接续符的使用

//13-2.c #include<stdio.h> // #define SWAP(a, b){int tmp = a; a = b; b = tmp;} #define SWAP(a, b) \ { \ int tmp = a; \ a = b; \ b = tmp; \ } int main(){ int a = 1; int b = 2; int c = 3; SWAP(a, b); printf("a = %d, b = %d\n", a, b); SWAP(b, c); printf("b = %d, c = %d\n", b, c); return 0; }

上面的程序中,第 3 行定义一个宏,作用是交换两数的值,与 4-9 行的程序相比,4-9 行使用的接续符,使得代码的可读性增加了。

2 转义字符

键盘上的按键分为两种,第一种是可以在屏幕上打印出来的这种,比如 a, b, c 等等,第二种是按下之后不能在键盘上打印出来的,比如回车键,Tab 键,这类符号该如何表示呢,这就需要转义字符了。

2.1 转义符的意义

C 语言中的转义符(\)主要用于表示无回显字符,也可用于表示常规字符

转义字符意义\n回车换行\tTab键(横向跳到下一制表位置)\v竖向跳格\b退格(BS) ,将当前位置移到前一列\r回车,将当前位置移到本行开头\f换页(FF),将当前位置移到下页开头\\反斜杠符“\”\’单引号符\a鸣铃(BEL)\ddd1~3位八进制所代表的字符\xhh1~2位十六进制数所代表的字符

2.2 转义符的使用

当反斜杠(\)作为转义符使用时必须出现在单引号或者双引号之间

下面通过一个例子来说明转义符的使用:

//13-3.c #include<stdio.h> int main(){ char enter = '\n'; char* p = "\141\t\x62"; printf("%s", p); printf("%c", enter); return 0; }

\141 表示八进制数 141 表示的字符,换成10进制数为97,对应的字符为 a; \t 等于Tab键,表示横向跳到下一制表位置; \x62 表示十六进制数 62 所代表的字符,换成十进制为 98,对应的字符为 b。

3 小结

C 语言中的反斜杠(\)同时具有接续符和转义字符的作用,作为接续符使用可直接出现在程序中,作为转义符使用时需出现在单引号或双引号之间。

最后我们来欣赏一下Google 华裔工程师 Don Hsi-Yun Yang 用 C 语言写的代码,该段代码获得 Best of Show 大奖 作用:处理三种文件格式(PGM、PPM 和 ASCII Art)的降采样工具,降低分辨率。

/* + + + + [ >i>n[t */ #include<stdio.h> /*2w0,1m2,]_<n+a m+o>r>i>=>(['0n1'0)1; */int/**/main(int/**/n,char**m){FILE*p,*q;int A,k,a,r,i/* #uinndcelfu_dset<rsitcdti_oa.nhs>i/_*/;char*d="P%" "d\n%d\40%d"/**/ "\n%d\n\00wb+",b[1024],y[]="yuriyurarararayuruyuri*daijiken**akkari~n**" "/y*u*k/riin<ty(uyr)g,aur,arr[a1r2a82*y2*/u*r{uyu}riOcyurhiyua**rrar+*arayra*=" "yuruyurwiyuriyurara'rariayuruyuriyuriyu>rarararayuruy9uriyu3riyurar_aBrMaPrOaWy^?" "*]/f]`;hvroai<dp/f*i*s/<ii(f)a{tpguat<cahfaurh(+uf)a;f}vivn+tf/g*`*w/jmaa+i`ni("/** */"i+k[>+b+i>++b++>l[rb";int/**/u;for(i=0;i<101;i++)y[i*2]^="~hktrvg~dmG*eoa+%squ#l2" ":(wn\"1l))v?wM353{/Y;lgcGp`vedllwudvOK`cct~[|ju {stkjalor(stwvne\"gt\"yogYURUYURI"[ i]^y[i*2+1]^4;/*!*/p=(n>1&&(m[1][0]-'-'||m[1][1] !='\0'))?fopen(m[1],y+298):stdin; /*y/riynrt~(^w^)],]c+h+a+r+*+*[n>)+{>f+o<r<(-m] =<2<5<64;}-]-(m+;yry[rm*])/[* */q=(n<3||!(m[2][0]-'-'||m[2][1]))?stdout /*]{ }[*/:fopen(m[2],d+14);if(!p||/* "]<<*-]>y++>u>>+r >+u+++y>--u---r>++i+++" <)< ;[>-m-.>a-.-i.++n.>[(w)*/!q/**/) return+printf("Can " "not\x20open\40%s\40" "" "for\40%sing\n",m[!p?1:2],!p?/* o=82]5<<+(+3+1+&.(+ m +-+1.)<)<|<|.6>4>-+(> m- &-1.9-2-)-|-|.28>-w-?-m.:>([28+ */"read":"writ");for ( a=k=u= 0;y[u]; u=2 +u){y[k++ ]=y[u];}if((a=fread(b,1,1024/* ,mY/R*Y"R*/,p/*U*/)/* R*/ )>/*U{ */ 2&& b/*Y*/[0]/*U*/=='P' &&4==/*"y*r/y)r\} */sscanf(b,d,&k,& A,& i, &r)&& ! (k-6&&k -5)&&r==255){u=A;if(n>3){/* ]&<1<6<?<m.-+1>3> +:+ .1>3+++ . -m-) -;.u+=++.1<0< <; f<o<r<(.;<([m(=)/8*/ u++;i++;}fprintf (q, d,k, u >>1,i>>1,r);u = k-5?8:4;k=3;}else /*]>*/{(u)=/*{ p> >u >t>-]s >++(.yryr*/+( n+14>17)?8/4:8*5/ 4;}for(r=i=0 ; ;){u*=6;u+= (n>3?1:0);if (y[u]&01)fputc(/* <g-e<t.c>h.a r -(-).)8+<1. >;+i.(<)< <)+{+i.f>([180*/1* (r),q);if(y[u ]&16)k=A;if (y[u]&2)k--;if(i/* ("^w^NAMORI; { I*/==a/*" )*/){/**/i=a=(u)*11 &255;if(1&&0>= (a= fread(b,1,1024,p))&& ")]i>(w)-;} { /i-f-(-m--M1-0.)<{" [ 8]==59/* */ )break;i=0;}r=b[i++] ;u+=(/**>> *..</<<<)<[[;]**/+8&* (y+u))?(10- r?4:2):(y[u] &4)?(k?2:4):2;u=y[u/* 49;7i\(w)/;} y}ru\=*ri[ ,mc]o;n}trientuu ren ( */]-(int)'`';} fclose( p);k= +fclose( q); /*] <*.na/m*o{ri{ d;^w^;} }^_^}} " */ return k- -1+ /*\' '-`*/ ( -/*}/ */0x01 ); {;{ }} ; /*^w^*/ ;}

原始代码远远看上去是一个小女孩,运行结果还是一个小女孩,只不过变小了,降低了分辨率。

最新回复(0)