嵌入式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);}}
- 嵌入式C语言基础—杂记一
- 嵌入式 Linux C语言——C语言基础
- 学习杂记(一)c语言
- 嵌入式基础之----C语言
- 嵌入式 c语言基础1
- 嵌入式 c语言基础2
- 嵌入式 c语言基础3
- c语言基础 一
- C语言基础一
- C语言基础一
- 一---c语言基础
- C语言基础一
- C语言基础(一)
- C语言基础(一)
- java基础杂记(一)
- C语言学习——数据类型杂记
- 51C语言杂记
- c语言杂记
- L1-002. 打印沙漏
- 我要15天消化掉Android官方API指南--第三天
- thymeleaf 学习笔记
- POJ3750 小孩报数问题【模拟】
- 写在前面
- 嵌入式C语言基础—杂记一
- python实现数据离散化
- 信任报道
- 扩展gcd
- 【FUTURE】麻省理工科技评论-年度10大突破性技术-导读
- Windows下TypeError numpy.float64 object cannot be interpreted as an index的解决
- 13.常用的函数
- 设计模式之策略模式
- java基础(二)