C语言疑难进阶手册(2)

目录

    • 预定义宏
    • 取消宏
    • 宏参数转换
    • 逗号运算符
    • 整数类型的8种组合
    • 进制表示
    • 浮点类型三种
    • 读写字符
    • 数组初始化
    • 多维数组
    • 变长数组

预定义宏

预定义宏是C语言中标准编译器预先定义的宏,在ANSI标准中C程序有5个预定义宏可以直接使用

ANSI标准中说明了以下5个宏替换名,可以直接使用
LINE:当前编译的代码的行号
FILE:当前编译文件的源文件名
DATE:当前源程序创建的日期
TIME:当前源程序创建的时间
STDC:判断当前的编译器是否为标准C编译器,若是则返回值1

取消宏

使用#undef 宏名的方式取消宏定义
取肖宏定义后,可以重新定义这个宏

宏参数转换

  • 标准C可以把宏的参数在展开之后转换为字符串常量。

#可作为单目操作符,用于字符串化,后面面是宏形参名称。
宏展开后,#形参被包含在双引号内的实参替换。

#include 
#define GETSTR(strTxt)  "str:" #strTxt "\n"
int main(int argc, char **argv)
{
    printf(GETSTR("hello"));
	return 0;
}

str:"hello"
Hit any key to continue...

  • 标记合并
    使用两个#可以合并标记。

比如 x##5结果是x5

#include 
#define GETVARNAME(n) x##n
int main(int argc, char **argv)
{
    for (int i=1;i<=5;i++){
        int GETVARNAME(i)=i;
        printf("%d\n",GETVARNAME(i));
    }
	return 0;
}

结果如下:

1
2
3
4
5
Hit any key to continue...

逗号运算符

任意多个表达式,从第一个表达式计算到最后一个表达式,最后一个表达式为最终值

#include 
#define GETVARNAME(n) x##n
int main(int argc, char **argv)
{
    int j=11;
    int i=22;
    int z=(j+=i,i+=j);
    printf("%d\n",z);
   
	return 0;
}

z的结果就是i最终的值。

55
Hit any key to continue...

#include 
#define GETVARNAME(n) x##n
int main(int argc, char **argv)
{
    int j;
    int i;
    for (j=0,i=(j+8) % 6; i<=5;i++){
        printf("%d\n",i);
    }
	return 0;
}

上面例子中参与循环条件的核心变量i的初始值,通过j计算得到。

2
3
4
5
Hit any key to continue...

整数类型的8种组合

short int
unsigned short int
int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

进制表示

十进制不能以0开头,包含0-9的数字
八进制以0开头,包含0-7的数字
十六进制以0x开头,包含0-9以及a-f

浮点类型三种

float :单精度
double:多精度
long double:扩展精度浮点

读写字符

ch=getchar()将字符读入到ch变量中,返回为int类型。
putchar(ch)将ch写入

数组初始化

  • 初始化
#include 

int main(int argc, char **argv)
{
    int x1[]={1,2,3,4,5};
    int x2[5]={1,2,3,4,5};
    int x3[5]={1};
    printf("%d %d %d\n",x1[1],x2[1],x3[1]);
	return 0;
}

运行结果如下:

2 2 0
Hit any key to continue...


注意,x3只初始化了第1个元素的值1,其它元素都初始化默认值0。

  • 指定初始化式
100 0 99
Hit any key to continue...

源代码如下:

#include 

int main(int argc, char **argv)
{
    int x4[5]={[1]=100,[3]=99};
    printf("%d %d %d\n",x4[1],x4[2],x4[3]);
	return 0;
}

指定索引的方式来指定值,其它索引的位置默认为0。

多维数组

使用下面格式

类型 变量名[第1维长度][第2维长度]....[第n维长度]
#include 



int main(int argc, char **argv)
{
    int x[2][3][2]={[1][2][1]=111};
    printf("%d %d\n",x[0][1][1],x[1][2][1]);
	return 0;
}

0 111
Hit any key to continue...


可以按索引位置指定值。

#include 

int main(int argc, char **argv)
{
    int x1[2][2]={1,2,3,4};
    int x2[2][2]={{1,2},{3,4}};
    int x3[3][2]={[2][1]=100,[2][0]=99};
    for (int i=0;i<3;i++){
        for (int j=0;j<2;j++){
            printf("%d ",x3[i][j]);
        }
        printf("\n ");
    }
    for (int i=0;i<2;i++){
        for (int j=0;j<2;j++){
            printf("%d ",x1[i][j]);
        }
        printf("\n ");
    }
    for (int i=0;i<2;i++){
        for (int j=0;j<2;j++){
            printf("%d ",x2[i][j]);
        }
        printf("\n ");
    }
	return 0;
}


结果如下

0 0 
 0 0 
 99 100 
 1 2 
 3 4 
 1 2 
 3 4 
 Hit any key to continue...

变长数组

数组长度在执行时计算,在编译时无法确定。

#include 



int main(int argc, char **argv)
{
   int n;
   printf("请输入长度:");
   scanf("%d",&n);
   int x[n];
   for (int i=0;i<n;i++){
       printf("\n请输入值:");
       scanf("%d",&x[n]);        
   }
  
	return 0;
}

结果如下:

请输入长度:5

请输入值:1

请输入值:2

请输入值:3

请输入值:4

请输入值:5
Hit any key to continue...

你可能感兴趣的:(软件架构与设计,c语言)