我们很容易忽略的常用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;
}
记住编译器不会检查数组越界的情况
****************************************************************************************************
持续中.................................