1、C语言经验技巧 位运算&的运用 a&0xff 高8位清零,底8位保持原数 a&0xff00 高8位保持原数,底8位清零 单精度和双精度的有效位数 在Turbo C里 float 有效位数7位 double 有效位数16位 (由左至右) 奇怪的(i++)+(i++)+(i++)表达式 (i++)+(i++)+(i++)这条表达式运算原理是这样的,它们都把i先赋值,比如i是5那么这 个得数就是15了。这里补充说明一下,有可能对于某种编译器有不同的结果,这里以TC 为例。 scanf 加*的作用 sanf格式符%后面放一个*,表示在
2、输入时跳过对应的输入项而不予读入 比如: scanf("%*c"); 没有任何输入 scanf("%*c%%d,data"); 代表前一个不予读入,跟着%%是输出%,再输入整数类型data do/while 循环语句 do 语句 while (条件) ; /*注意do/while循环语句结尾一定要加上分号;*/ 还有就是do/while和其它编程语言的不同,它的条件不是直到真才退出,而是当真是才 退出。不过我们可以动些手脚,小技巧将它改为直到条件才退出,就是将条件改为逻辑非 求位数 main() { long num=1234567
3、n; n=(num%1000000)/100000; /* 求余数再除 */ printf("%d",n); } 例:(num%1000000)/100000 求十万位 (num%1000)/100 求十位 经过上例引出如果想得到什么位的就余想求的数再除以该位数,不过数据类型一定为正 数。 求得扫描码 ESC 0x11b UP 0x4800 DOWN 0x5000 LEFT 0x4b00 RIGHT 0x4d00 如果想知到键盘的数据码就要用到bioskey(0) /******************************
4、/ bioskey函数 函数原型: int bioskey(int cmd); 函数功能: 利用函数bioskey可以实现三种功能,参数cmd为要实现的功能号,值只能为0、1、2,具 体含义如下: 0:在系统中有一个按键队列,所有的键盘按键都在这里排成队。该功能就是如果按键队 列中有按键,那么读取队列首位的按键,并返回按键值;否则等待键盘按键出现。( 其 中按键值的高字节为扫描码,低字节为ASCII码) 1:如果按键队列中没有按键,那么返回零,否则返回非零。 2:返回特殊按键Shift、
5、Ctrl、Alt等键的按键状态。
/****************************************************************/
#include
6、 printf("%d \n",key[1]); if(key[0]==1)exit(1); } } } specialkey(int key[2]) { if(bioskey(1)){key[0]=0;key[1]=0;return;} key[0]=key[1]=bioskey(0); key[0]>>=8; /*高八位落到底八位*/ key[1]&=0xff; /*高八位清零 0xff00 这个是底八位清零 */ } 0xff = ff16 = 111111112 等待函数 delay(5000); /*参加单
7、位微秒,这个函数通常都不精确*/
sleep(5); /*参加单位秒,比较精确*/
几个常用的循环
for(;;)
{
:
:
} /*没条件循环*/
while()
{
:
:
} /*没条件循环*/
while((c=getch())!='\n')
{
:
:
} /*这个是通常用来循环赋值给字符数组,直到回车才停止*/
while(*py!='\0')
printf("%c",*py++); /*同样也可以用pritnf("%s",py);
随机函数
#include 8、me.h>
randomize(); /*随机种子*/
random(10); /*值为十之内的数*/
另一种
#include 9、is :%d",x);
}
scanf();和gets();字符输入函数的比较
scanf("%s",s);这个函数不可以输入有空格的字符串,因为输入空格就代表着输入另一
个格式变量了。
gets();这个函数就可以输入有空格的字符串,不过一次只可以输入单一个变量的值。
const的一个好用处(函数形参)
void deal(const int [][13],const char * []);
const 的作用是不改变传入的实参数
几个常用输入字符函数的比较
getch(void)
c=getch(); /*返回从键盘读入的字符, 10、不显示出来*/
getche(void)
c=getche(); /*返回从键盘读入的字符,显示出来*/
C语言里"%n"是什么意思
是储存Printf 中前面的字符个数>
int i,j;
printf("Andywu%nGPAStudio%n",&i,&j);
printf("%d,%d",i,j); /*那么输出的就是6和9*/
通过bioskey(1);来到实现不执行当前的命令而跳往下一条命令
#include 11、
{
int key;
int i;
for(;;)
{
if(bioskey(1)!=0) /*就是这个函数的主要功能了*/
{
key=bioskey(0);
if((key & 0x00ff)) key=key&0xff;
}
gotoxy(40,30);
printf("%d",i++);
if(key==27) break;
}
gotoxy(50,40);
cputs("结束");
getch();
}
kbhit()函数的,用来判断当前是否按下键
while(!kbhit()) /*k 12、bhit(); */
{
printf("%d",i);
delay(1000);
}
数组指针
int (*p)[4];
是定义一个指向四个元素的数组指针
main(){
{
int a[4];
int (*p)[4];
int count;
p=a;
for(count=0;count<4;count++)
{
printf("%d",*(p+i));
}
}
指向数组的指针运算
int a[3][4];
*(a+2)+3 ?è&a[0]+11 同样也可以为下式:
*(a+2)+3 ?è & 13、a[0][0]+4*2+3
因为a[0]和a[0][0]都代表了首地址
扬声器发音
sound(n); /*n是一个过百位数的数,比如100、200之类的数 到什么数没有我都不太清
楚了!*/
delay(1000); /*声音时间长度 也可以用sleep(1)*/
nosound(); /*关闭声音*/
调试后看结果的问题
一个网友的问题"用一些c的编译器编译程序,在执行时,弹出的ms-dos窗口对结果数据
显示的太快,我还什么都没看到呢,窗口就关了,怎么办呀?"
其实可以用这个命令getch();来到停止当时的程序。
复合运算符 14、的特别运算
a/=b+c
这些都是一定先求了左边的才运算这个复合运算。
特殊的按键(方向键等)
在C语言扫描码是所有键盘上的识别码,ASCII码也是键盘里的字母和数字。但是就是有
些特殊的键盘表达不出来,通常我们编程常常就需要这些按键,就象方向键和HOME、END
,F1、F2……等之类的键。可是我们就只知道ASCII码,其实有一个技巧可以得到它的扫
描码。程序如下:
int key;
key=bioskey(0); /*得到扫描码和ASCII 高八位扫描码,低八位ASCII码*/
if ( key & 0x00ff ) key=key&0x00f 15、f; /*如果低八位有的话就证明这可以用ASCII表达
出来的*/
else key=key>>8; /*否非则是向下移动八位取得高八位的扫描码*/
动态伸请数组
我们定义一个数组常常是规定了其长度,如果定义得少就不够用,定义得多了就会浪费
空间,那么我们怎么来控制这种场面呢?是有方法的,因为不是太直观所以都没有常用
。
int *ab;
ab=(int *)malloc(n*sizeof(int); /*n这里是变量,随自己输的*/
这样就生成了一个指向n个空间的新地址,赋给了ab,ab就为首地址,像我们平时用数组
一样的形式调用第几个元素
16、ab[0];/*这里是第一个元素*/
ab[1];/*第二个元素*/
其实当然也可以算指针的形式一样*(ab+0)和 *(ab+1)一样来到调用。
更灵活的一点就是不用的空间可以随时给删除,用free()这个函数
free(ab);这里只是删除当前ab指向的那个空间,而不是全部删除,知道了这点我们就
可以利用循环等其它方法来批量删除或其它特别的用途,这完全要靠自己的想象力了。
神秘函数getpass();
#include 17、Please input the number"); /*这里输入不能显示出屏幕
*/
printf("%s",password);
}
这个函数可以用来做密码保护功能
指针的类型和指针所指向的类型
通常我们都很容易搞错这两个概念,因为就看上去好像就是一样吗。可是真正运用起来
就有很大的区别,就像下面的一个例子吧。
main()
{
int *p; /*这里定义的是一个整数的指针*/
char c[]="ynynynynyn";
int i;
p=c; /*这里将字符数组的地址传了给整型指针*/
for(i=0;i<5;i++)
18、
{
printf("%c",*p++); /*结果这里输出的是5个y 是因为整型指针相对移动地址是2字节,
而字符是一字节的,所以跳过了一个字符*/
}
getch();
}
exit(0)和exit(1)的区别
其实这也没有什么特别的,不过是从书上看回来,现在记录下来。
exit(0); /*这个是正常的关闭所有程序 */
exit(1); /*这个就刚好相反,有错误的关闭 */
time_t 和 clock_t 的数据类型
time_t 通常用来记录时间的类型,其实它只是长整型数据,
可以在time.h头文件来看到,如下是它的定义;
typedef long time_t;
typedef long clock_t;






