我们很容易忽略的常用c语言知识
来源:互联网 发布:淘宝店主培训 编辑:程序博客网 时间:2024/05/17 12:48
我们很容易忽略的常用c语言知识
****************************************************************************************************
struct space{
int a; //4字节
char b; //4字节
float c; //4字节
double d; //8字节
}haha;
请问space占用多大空间呢?
sizeof(haha)的结果是20;
如果是这样呢
#include<stdio.h>
struct space{
char a;
//int b;
//float c;
double d;
}haha;
int main(){
printf("%d\n",sizeof(haha));
}
结果是12;不管怎么样知道c语言帮你做了数据对齐操作就可以,char型的数据会自动变为4,8的倍数
例如char a[5],那么它实际占的空间为8知道就可以了(当然编译器不一样,其结果也是不一样的)
其实我们还有一种struct写法
struct space{
int a:2;
int b:2;
}haha;
C/C++语言的结构体支持对其中的基本成员变量按位拆分;
****************************************************************************************************
c语言中没有bool或者BOOLEAN,c语言默认0是假,大于0的数为真,那我想用怎么办呢
#include<stdio.h>
#include<string.h>
typedef int bool; //typedef自定义数据类型
enum{false,true};
static char s[20]={0};
bool fun(){
if(gets(s) != NULL)
return true;
else
return false;
}
int main(){
if(fun()){
printf("%s\n",s);
}
}
****************************************************************************************************
我们常用的宏定义
1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
3,得到指定地址上的一个字节或字
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )
4,求最大值和最小值
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
5 返回一个比X大的最接近的8的倍数
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
6,将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
7,判断字符是不是10进值的数字
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
8,判断字符是不是16进值的数字
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
((c) >= 'A' && (c) <= 'F') ||\
((c) >= 'a' && (c) <= 'f') )
9,防止溢出的一个方法
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
10,返回数组元素的个数
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
11 宏中"#"和"##"的用法
一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int main()
{
printf(STR(vck)); // 输出字符串"vck"
printf("%d
", CONS(2,3)); // 2e3 输出:2000
return 0;
}
A N S I标准说明了五个预定义的宏名。它们是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
****************************************************************************************************
自己写的程序结果很惊讶
#include<stdio.h>
#include<string.h>
int main(){
int i;
char *str="abcdef";
int p[0] = {1,2,3};
p[33] = 3;
char visit[5]={0};
visit[str[2]]=3; //visit[99] =3
printf("%c\n",str[2]); //打印字母c
printf("%d\n",str[2]); //打印数字99
printf("%o\n",visit[str[2]]);//打印数字3
printf("%d\n",p[33]);
printf("%d\n",sizeof(str));//打印4,指针大小为4
printf("%d\n",strlen(str));//打印6
char s[80];
memset(s,0,sizeof(s));
printf("%d\n",sizeof(s));//打印80 , 可以看出s是地址不是指针,只有作为参数传递时,才看成指针
printf("%d\n",strlen(s));//打印0
return 0;
}
记住编译器不会检查数组越界的情况
****************************************************************************************************
持续中.................................
****************************************************************************************************
struct space{
int a; //4字节
char b; //4字节
float c; //4字节
double d; //8字节
}haha;
请问space占用多大空间呢?
sizeof(haha)的结果是20;
如果是这样呢
#include<stdio.h>
struct space{
char a;
//int b;
//float c;
double d;
}haha;
int main(){
printf("%d\n",sizeof(haha));
}
结果是12;不管怎么样知道c语言帮你做了数据对齐操作就可以,char型的数据会自动变为4,8的倍数
例如char a[5],那么它实际占的空间为8知道就可以了(当然编译器不一样,其结果也是不一样的)
其实我们还有一种struct写法
struct space{
int a:2;
int b:2;
}haha;
C/C++语言的结构体支持对其中的基本成员变量按位拆分;
****************************************************************************************************
c语言中没有bool或者BOOLEAN,c语言默认0是假,大于0的数为真,那我想用怎么办呢
#include<stdio.h>
#include<string.h>
typedef int bool; //typedef自定义数据类型
enum{false,true};
static char s[20]={0};
bool fun(){
if(gets(s) != NULL)
return true;
else
return false;
}
int main(){
if(fun()){
printf("%s\n",s);
}
}
****************************************************************************************************
我们常用的宏定义
1,防止一个头文件被重复包含
#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedef unsigned char boolean; /* Boolean value type. */
typedef unsigned long int uint32; /* Unsigned 32 bit value */
3,得到指定地址上的一个字节或字
#define MEM_B( x ) ( *( (byte *) (x) ) )
#define MEM_W( x ) ( *( (word *) (x) ) )
4,求最大值和最小值
#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
5 返回一个比X大的最接近的8的倍数
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
6,将一个字母转换为大写
#define UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
7,判断字符是不是10进值的数字
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
8,判断字符是不是16进值的数字
#define HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
((c) >= 'A' && (c) <= 'F') ||\
((c) >= 'a' && (c) <= 'f') )
9,防止溢出的一个方法
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
10,返回数组元素的个数
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
11 宏中"#"和"##"的用法
一、一般用法
我们使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.
用法:
#include<cstdio>
#include<climits>
using namespace std;
#define STR(s) #s
#define CONS(a,b) int(a##e##b)
int main()
{
printf(STR(vck)); // 输出字符串"vck"
printf("%d
", CONS(2,3)); // 2e3 输出:2000
return 0;
}
A N S I标准说明了五个预定义的宏名。它们是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
****************************************************************************************************
自己写的程序结果很惊讶
#include<stdio.h>
#include<string.h>
int main(){
int i;
char *str="abcdef";
int p[0] = {1,2,3};
p[33] = 3;
char visit[5]={0};
visit[str[2]]=3; //visit[99] =3
printf("%c\n",str[2]); //打印字母c
printf("%d\n",str[2]); //打印数字99
printf("%o\n",visit[str[2]]);//打印数字3
printf("%d\n",p[33]);
printf("%d\n",sizeof(str));//打印4,指针大小为4
printf("%d\n",strlen(str));//打印6
char s[80];
memset(s,0,sizeof(s));
printf("%d\n",sizeof(s));//打印80 , 可以看出s是地址不是指针,只有作为参数传递时,才看成指针
printf("%d\n",strlen(s));//打印0
return 0;
}
记住编译器不会检查数组越界的情况
****************************************************************************************************
持续中.................................
- 我们很容易忽略的常用c语言知识
- 我们很容易忽略的c语言知识(二)
- 一些很容易被忽略但又很有用的 C 语言函数
- 那些我们不曾注意的C语言小众知识(一)
- C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
- 一个很容易被忽略的东西----toString()
- c语言常用知识1
- C语言常用知识积累
- 我们可以很容易操作的SEO减法
- c语言常用到的几个冷知识
- json-c有时我们会忽略的问题
- C语言中易被忽略的地方
- 我所忽略的c 语言标准
- C语言中容易忽略的问题
- C语言中可能忽略的“注释”
- c语言容易忽略的点
- 常用但忽略的android知识1-Inflate
- 常用但忽略的anroid知识2-回调问题
- 工厂方法模式
- 创建进程
- hbase rest接口
- 什么是makefile?
- 一步一步写 MakefileC/C++
- 我们很容易忽略的常用c语言知识
- [gkk传智]static与多态及向下向上转型,及多态调用总结
- 字符串转换为字节数组并计算二者汉明距离
- java连接mysql数据库;java读写excel表格
- 详解Objective-C语法快速参考C/C++
- Android 开 发 教 程 汇 总
- 泊松融合
- POJ 1611 The Suspects【并查集入门】
- Jetty开发的若干笔记(待整理)