C tricks

本篇文章收集一些不常被注意到的C语言技巧。

1)打印自己的程序

Google一下“打印自己的程序”能找到一大堆,下面这个是我在Hacker’s Delight的前言里看到的,据说这个是最短的,只有64个字符(不包含头文件):

#include <stdio.h>

main(a){printf(a,34,a=”main(a){printf(a,34,a=%c%s%c,34);}”,34);}

它会输出“main(a){printf(a,34,a=”main(a){printf(a,34,a=%c%s%c,34);}”,34);}”,在gcc上可编译运行,VC上不可以。

2)sizeof()

sizeof()是操作符而不是函数,sizeof(++i)并不会使i加1,因为在编译的时候就可以得到++i的大小了,所以自增运算符不会被执行。

3)常量前、后缀

*

0x10是十进制的16;010是十进制的8;

**

int a=2147483648u,b=-1;

printf(“a=%d\nb=%u\n”);//2147483648(即1<<31)当做int型是最小的负数-2147483648,-1当做unsigned是最大的正数:(1<<32)-1

***

此外,后缀ll代表long long。ull代表unsigned long long。f代表float。e代表浮点型,如0x23e2L。不区分大小写。

0x23e2==9186.000000不知道什么规则

4)序号和数组名互换

char a[]=”kingbigeast”;//那么a[2]就是‘n’,其实a[2]也可以用2[a]代替。因为a[2]=*(a+2)=*(2+a)=2[a]

int pos=3,po=5;//这样printf(“%c”,&pos[a]);会输出a的第四个字符g

printf(“%c%c%c\n”,&pos[“apple”],&po[“banana”],&po[“pineapple”]);//输出lap

printf(“%c\n”,”Google”[4]);//输出l。可见常量字符串也可当数组名使用。它也有地址不过没有用变量表示来

5)scanf()的 [set]参数

char del[30];

scanf(“%[^b]”,del)//假设输入“kingbigeast”

printf(“%s\n”,del);//输出是“king”,因为遇到字符b就停止向del中传送了

Advertisements
上一篇文章
下一篇文章
留下评论

一条评论

  1. C Traps&Pitfalls总结 « Prime8051

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: