嵌入式C语言基础—杂记一

来源:互联网 发布:C# js escape 编辑:程序博客网 时间:2024/05/16 17:14

1、预定义

预定义的符号

符号示例含义__FILE__/home/hello.c正在编译的源文件文件名__LINE__5文件当前行的行号__FUNCTION__main当前所在函数名__DATE__Mar 13 2009预编译文件的日期__TIME__22:00:32预编译文件时间

2、程序块中变量应用

void main()

{

int a=4;

{

int a=3;

}

printf("%d",a) ;   // a=4 ;

}

3、宏定义

3.1 、简化函数

#include <stdio.h>

#define  P printf
#define  D "%d\n"
#define  F "%f\n"

void main()
{
   int a =  3 ;
   float b=3.0f;

   P(D F , a ,b);  // 此处应用比较特殊
}

3.2 带形参的宏

#define  SQ(y)   (y)*(y)   //

sq=160/SQ(a+1);

宏替换后变为:  sq=160 / (a+1)*(a+1)   //显然错误哈

正确定义:

#define  SQ(y)  ((y) * (y))   //正确的宏定义

4、联合体测试大小端

void main(){   union a   {    char c[4];    int b;  };  union  a var;  var.c[0]=0x01;  var.c[1]=0x02;  var.c[2]=0x03;  var.c[3]=0x04;  printf("h= %x \n",var.b); }

5、格式化输出函数printf

printf支持的格式说明符的修饰符

                   修饰符          
功能m输出数据宽度,数据长度<m 左补空格;否则按实际输出.n1:对实数,指定小数点后位数;2:对字符串,指定实际输出位数-输出数据在域内左对齐(缺省右对齐)+指定在有符号数的正数前显示正号0输出数值时指定左面不使用的空位置自动填0#在八进制和十六进制数前显示前导0,0x

eg:

(1)、  %8d  1234  不够八位,左补四个空格。  %2d  2 不起作用

(2)、%10.5s    hello world   左补5个空格,输出hello 

 %-10.3s  hello world    右补7个空格 ,输出hel.

(3)、%08d   1234   实际输出   00001234

(4)、%0+8d  1234   实际输出  +00001234

(5)、  %o  173   ; %#o  0173;  %#X  0X7B

 

6、使用scanf函数可能留下垃圾:

代码如下:

#include <stdio.h>#include <string.h>void main(){int a;char ch;printf("input a number:");scanf("%d",&a);printf("a=%d\n",a);//part xprintf("input a character:");scanf("%c",&ch);printf("ch = %c,ch = %d \n",ch ,ch);}

现象:用户输入第一个数后,回车后,接下来的读取函数会直接取走残留的\n ,即换行符就是垃圾字符。

解决方法:

(1)、调用getchar函数

 在上述函数中part x中加入getchar();

(2)、用%*c 忽略掉\n

具体代码如下:

#include <stdio.h>#include <string.h>void main(){int a;char ch;printf("input a number:");scanf("%d",&a);printf("a=%d\n",a);printf("input a character:");scanf("%*c%c",&ch);printf("ch = %c,ch = %d \n",ch ,ch);}

7、数据类型转换

不同的数据类型在进行混合运算时,要先转换成同一类型后再运算,有两种转换方式:

(1)、自动类型转换

自动类型转换规则:

char、short--------->int --------------->unsigned ----------------->long---------------------->double <----------------------float

(低--------------------------------------高)

(2)、强制类型转换

当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容,较高类型转换为较低数据类型可能有数据丢失。

8、位运算符和表达式

8.1 逻辑移位和算术移位

(1)、逻辑移位

         不考虑符号问题,原数据右移n个位置后,左边空出的n个位置,用0填充。

(2)、算术移位

右移n位后,左边空出的n个位置,用原数值的符号位填充,原来若是负数,则符号位为1,填充的位也为1。原来若是正数,则符号位为0.填充位也为0.

eg: 数“10001001”,逻辑移位的结果是“00100010”,算术移位的结果是“11100010”(右移)

     左移时,左边移出去的位丢弃,右边补0,两者是一样的(左移)

(备注:不同的编译器所产生的结果有可能会不同。)

8.2 位表达式

 在位表达式中,取反运算符优先级最高,其次是移位运算符(<<和>>),再次是与或非。

备注:在移位操作中,左移n位相当于将原数乘以2^n,右移n位相当于将原数除以2^n. (移位操作运行效率相当高)

9、数组和scanf

(1)、一维数组的长度可以省略,二维的不能省略。

eg:     int str[2][ ]={{1,2},{2,3}};  //会报错

(2)、解决空格后的字符无法存储到数组的问题

#define N 20void main(){int i = 0;char str[N]={0};printf(">");while ( scanf("%s",str) !=EOF){printf(">");i++;printf(" i = %d , str = %s \n", i, str);}}

































原创粉丝点击