1.对于这个程序测试环境是redhat7.0,编译器用的是gcc,主要是熟悉一下如何使用linux下的这些函数,如何使用man自己查阅
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
void print_week(int ); //输出周
void print_annimal_year(int); // 输出生肖年
void print_week(int num)
{
switch(num){
case 1 : printf(" Mon");
break;
case 2 : printf(" Tus");
break;
case 3 : printf(" Wes");
break;
case 4 : printf(" Tue");
break;
case 5 : printf(" Fri");
break;
case 6 : printf(" Sau");
break;
case 7 : printf(" Sun");
break;
}
}
void print_annimal_year (int num)
{
int annimal = (num - 1970)%12;
switch(annimal){
case 0:printf(" 狗");
break;
case 1:printf(" 猪");
break;
case 2:printf(" 鼠");
break;
case 3:printf(" 牛");
break;
case 4:printf(" 虎");
break;
case 5:printf(" 兔");
break;
case 6:printf(" 龙");
break;
case 7:printf(" 蛇");
break;
case 8:printf(" 马");
break;
case 9:printf(" 羊");
break;
case 10:printf(" 猴");
break;
case 11:printf(" 鸡");
break;
}
printf("\n");
}
int main(int argc,char *argv[])
{
struct timespec tp;
struct tm *my_tm = NULL;
clock_gettime(CLOCK_REALTIME,&tp);
// printf("tv_sec = %ld\n",tp.tv_sec);
// printf("tv_nsec = %ld\n",tp.tv_nsec);
my_tm = gmtime(&(tp.tv_sec));
printf("%d-%d-%d ",my_tm->tm_year + 1900,my_tm->tm_mon + 1,my_tm->tm_mday + 1);
printf("%d-%d-%d.%d(%d) ",my_tm->tm_hour + 8,my_tm->tm_min,my_tm->tm_sec,tp.tv_nsec/1000,tp.tv_nsec);
//调用周函数
print_week(my_tm->tm_wday);
//调用生肖年函数
print_annimal_year(my_tm->tm_year + 1900);
return 0;
}
运行结果
2.对于大小端的问题,这个很好测试,共用体里面一个int 和 char数组,然后分别打印出他们的值运行结果,低位存储的是低位因此是小端
3.在redhat 7.0下gcc编译器中C++中的引用是占用8个字节的
4.处理大数的思路
#include <stdio.h>
#include <string.h>
#define MAXLEN 500
int flag = 0; //标志数组应该从哪里开始计算
int a[MAXLEN];
int b[MAXLEN];
int c[2*MAXLEN]; //将每一位的计算结果都保存在里面
// 翻转过来好处理
void reverse_str(char *str,int *array,int len)
{
int i = 0;
for(i = 0; i < len; i++){
array[len - i - 1] = str[i] - '0'; //刚开始忘记'0'
}//end for
}
void multiply(int *a,int *b,int *c,int sa_len,int sb_len)
{
int i = 0;
int j = 0;
int sum_len = sa_len + sb_len - 1;
for(i = 0; i < sa_len; i++){
for(j = 0; j < sb_len; j++){
c[i + j] += a[i] * b[j];
printf("c[%d]= %d ",i+j,c[i+j]);
}//end for 2
printf("\n");
}//end for 1
for(i = 0; i < sum_len - 1; i++){
c[i+1] += c[i] / 10;
c[i] %= 10;
}//end for
if(c[i] != 0){
flag = i;
}else{
flag = i - 1;
}//end if else
}
void print_c_array(int *c,int sa_len,int sb_len)
{
int i = 0;
int sum_len = sa_len + sb_len;
for(i = flag; i >= 0; i--){
printf("%d",c[i]);
}//end for
printf("\n");
}
int main(int argc,char *argv[])
{
char sa[MAXLEN];
char sb[MAXLEN];
int sa_len = 0;
int sb_len = 0;
memset(sa,0x00,sizeof(sa));
memset(sb,0x00,sizeof(sb));
gets(sa);
gets(sb);
sa_len = strlen(sa);
sb_len = strlen(sb);
printf("%s %d\n",sa,sa_len);
printf("%s %d\n",sb,sb_len);
reverse_str(sa,a,sa_len);
reverse_str(sb,b,sb_len);
multiply(a,b,c,sa_len,sb_len);
print_c_array(c,sa_len,sb_len);
return 0;
}
#include <stdio.h>
#include <string.h>
#define MAXLEN 100
int flag; //标志数组应该从哪里开始计算
int a[MAXLEN];
int b[MAXLEN];
int c[MAXLEN+1]; //将每一位的计算结果都保存在里面
// 翻转过来好处理
void reverse_str(char *str,int *array,int len)
{
int i = 0;
int j = MAXLEN - 1;
// 1 2 3 4 5 6
// 4 5 6
for(i = len - 1; i >= 0; i--){
array[j--] = str[i] - '0';
}//end for
}
void large_number_add(int *a,int *b,int *c,int sa_len,int sb_len)
{
int i = 0;
int j = MAXLEN - 1;
int m = sa_len>sb_len?sa_len:sb_len;
for(i = 0; i < m; i++,j--){
c[j] += a[j] + b[j];
if(c[j] >= 10){
c[j-1] += c[j] / 10;
c[j] = c[j] % 10;
}
printf("c[%d]=%d,c[%d]=%d\n",j,c[j],j-1,c[j-1]);
}
if(c[j] != 0){
flag = j;
}else{
flag = j + 1;
}
}
void print_c_array(int *c,int sa_len,int sb_len)
{
int i = 0;
int sum_len = sa_len + sb_len;
for(i = flag; i < MAXLEN; i++){
printf("%d",c[i]);
}//end for
printf("\n");
}
int main(int argc,char *argv[])
{
char sa[MAXLEN];
char sb[MAXLEN];
int sa_len = 0;
int sb_len = 0;
memset(sa,0x00,sizeof(sa));
memset(sb,0x00,sizeof(sb));
gets(sa);
gets(sb);
sa_len = strlen(sa);
sb_len = strlen(sb);
printf("%s %d\n",sa,sa_len);
printf("%s %d\n",sb,sb_len);
reverse_str(sa,a,sa_len);
reverse_str(sb,b,sb_len);
large_number_add(a,b,c,sa_len,sb_len);
print_c_array(c,sa_len,sb_len);
return 0;
}
5.对于的define和typedef
include <stdio.h>
#define max(a,b) ((a)>(b)?a:b)
//int max(int a,int b);
//double max(double a,double b);
int main(int argc,char *argv[])
{
printf("max(5,6)=%d\n",max(5,6));
printf("max(2.8,3.2) = %lf\n",max(2.8,3.2));
return 0;
}
#include <stdio.h>
#define print_zero_n(num) do { \
printf("%d\n",num); \
num--; \
}while(num)
int main(int argc,char *argv[])
{
int num = 10;
print_zero_n(num);
return 0;
}
不会出现硬类型,typedef 也可以屏蔽类型
6.对于windows下的VC编译器中的可重入读写函数
freopen("data.in","r",stdin)
freopen("data.out","w",stdout)
7.malloc是不可重入但是线程安全的函数,因为malloc函数在用户空间要自己管理各进程共享的内存链表,由于有共享资源访问,本身会造成线程不安全。malloc并不是用于大量内存分配操作(容易产生碎片,速度问题),并且在多线程下也不太适合(malloc是不可重入但是线程安全的函数)
8.tcmalloc尝试使用粒度较好和有效的自旋锁,redis用jemalloc来解决内存碎片问题,jemalloc因为Facebook火起来的,FreeBSD很有名的开发人员,现在用在火狐上,tcmalloc是google的
9.在C语言中的struct中不可以写函数,但是C++里面可以写函数
struct node{
int x;
int y;
int max(){
return x>y?x:y;
}
}a[10];
10.if 和 for的嵌套问题,其实if 包含for效率更高,寄存器不用来回的切换,if 判断之后,一直执行for语句,肯定效率高。
11.函数指针的简单使用
#include <stdio.h>
void (*print)(void *,int);
void print_int(void *array,int n)
{
int i = 0;
for(i = 0; i < n; i++){
printf("%d ",((int*)array)[i]);
}
printf("\n");
}
void print_double(void *array,int n)
{
int i = 0;
for(i = 0; i < n; i++){
printf("%.2f ",((double*)array)[i]);
}
printf("\n");
}
void print_num(void *array,int n,void (*print)(void *,int))
{
print(array,n);
}
int main(int argc,char *argv[])
{
int array_int[5] = {1,2,3,4,5};
double array_double[5] ={1.2,2.5,3.6,4.7,5.8};
print_num(array_int,5,print_int);
print_num(array_double,5,print_double);
return 0;
}