C语言学习



字符串的输入输出

   puts函数只需要给出字符串参数的地址

/**put_out.c---使用puts()*/
#include<stdio.h>
#define DEF "i am a #define string"
int main(void)
{
	char str1[80]="An array was initialized to me.";
	const char *str2="A pointer was initialized to me.";
	
	puts("I'm an argument to puts().");
	puts(DEF);
	puts(str1);
	puts(str2);
	puts(&str1[5]);//从数组下标第五个开始输出
	puts(str2+4);
	return 0;
}

puts()显示字符串时自动在其后添加一个换行符







printf()  使用修饰符和标志示例

/*width.c--字段宽度*/
#include<stdio.h>
#define PAGES 931
int main(void)
{
	printf("*%d*\n", PAGES);
	printf("*%2d*\n", PAGES);
	printf("*%10d*\n", PAGES);
	printf("*%-10d*\n", PAGES);
	return 0;
}
第一个转换说明是不带任何修饰符的%d。他生成了一个与要打印的整数相同的字段。这是默认选项也就是说在没有进一步的指令下,这就是打印出的结果
第二个转换说明是%2d。他指示应该产生宽度为2的字段,但是由于该整数有3位数字,所以字段自动扩展以适应数字的长度。
第三个转换说明是%10d  这将产生一个长度为10个空格那么宽的字段,于是在星号之间有7个空白和三个数字,并且数字位于10个字段的,在星号之间有7个空白3个数字,并且数字位位于最右端。
最后一个是说说明%-10d,它产生10个空格宽的字段,标志‘-’ 把数字放到最左端




翻译程序的第一步首先把源代码中出现的字符映射到源字符集


明显常量#define 的用符号#开头,ANSI标准允许#前有空格或制表符,而且该标准还允许在#和指令的其余部分之间有空格,并且要求#和指令的其余部分不能有空格。


指令的定义域从指令的开始直到文件的末尾  定义符号常量明显常量预处理器指令从#开始,到其后第一个换行符为止,指令的长度限于一行代码

/*简单的预处理器的例子*/
#include<stdio.h>
#define TWO 2
#define OW "Consistency is the last refuge of the unimagina\
tive. -Oscar Wilde"   /*反斜线把这个定义延续到下一行*/
#define FOUR TWO*TWO
#define PX printf("X is %d.\n",x)
#define FMT "X is %d.\n"

int main(void)
{
	int x=TWO;
	PX;
	x=FOUR;
	printf(FMT,x);
	printf("%s\n",OW);
	printf("TWO:OW\n");
	return 0;
}

每个#define行有三部分组成 第一部分指令为#define自身。第二部分为所选择的缩略语,这些缩略语称为宏   宏的名字之间不允许有空格,而且必须遵循命名规则:只能使用字母数字下划线(第一个不能用数字开头)。第三部分称为替换列表主体,从宏变为最终的替换文本的过程称为宏展开

#define PX printf("x is %d.\n",x);

  预处理   宏        主体

预处理器不进行计算,他只是按照指令进行文字替换操作


宏定义中可以含有其他宏



语言符号

  系统把宏的主体当作语言符号(token)类型字符串,而不是字符型字符串


在#define中使用参数  ,可以创建外形和作用都相似的类函数宏,宏的参数也用圆括号括起来

下面是一个类函数宏定义的示例:

#define SQUARE(x)  x*x

在程序中可以这样使用  z=SQUARE(2);    //z=4


/**mac_arg.c 带有参数的宏*/
#include<stdio.h>
#define SQUARE(x) x*x
#define PR(X) printf("The result is %d.\n",X)
int main(void)
{	
	int x=4;
	int z;
	printf("x=%d\n",x);
	z=SQUARE(x);
	printf("Evluating SQUARE(x):");
	PR(z);
	z=SQUARE(2);
	printf("Evluating SQUARE(2):");
	PR(z);
	printf("Evluating SQUARE(x+2):");
	PR(SQUARE(2+x));
	printf("Evluating 100/SQUARE(2):");
	PR(100/SQUARE(2));
	printf("x is %d.\n",x);
	printf("Evluating SQUARE(++x):");
	PR(SQUARE(++x));
	printf("After incrementing,x is %x.\n",x);	
	return 0;
}


typedef简介

        typedef工具是一种高级数据特性,他使用户能够为某一类型创建用户的名字,与#define有三个不同之处

  • 与define不同,typedef给出的符号名称仅限于对类型,而不是对值。
  • 解释由编译器进行,而不是预处理器执行
  •  虽然他的范围有限,但在其受限范围内,typedef比#define灵活   
 该定义如果是在一个函数的内部,那么他的作用域就是局部,定义在函数的外部他就是全局作用域

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值