//
,在这之前的标准C使用`/**/
freebsd@localhost:~/learnc % cat learn1.c
#include
#include
int main(){
char*s1="hello,world";
char s2[]="I love c!";
wchar_t * s3=L"你好,世界";
// s1[3]='x';
s2[3]='x';
printf("%s\n",s2);
}
freebsd@localhost:~/learnc % cc learn1.c
freebsd@localhost:~/learnc % ./a.out
I lxve c!
s1[3]='x';
如去掉注释,程序在运行时将出错,因为s1是只读的。
freebsd@localhost:~/learnc % vim learn1.c
#include
#include
int main(){
char* s="斯柯达";
printf("%s\n",s);
char* s1="xxxxxx";
printf("%s\n",s1);
return 0;
}
freebsd@localhost:~/learnc % cc learn1.c -o test
freebsd@localhost:~/learnc % ./test
斯柯达
xxxxxx
printf("hello,world");
也可以包含格式串和内容
printf("hello,%s","张三");
也就是说第一个参数包含普通字符和转换说明,转换说明以%
开头。
%d 有符号十进制整数
%i 有符号十进制整数
%u 无符号十进制整数
%o 八进制整数
%x 十六进制整数(小写字母)
%X 十六进制整数(大写字母)
%f 浮点数
%e 用科学计数法表示的浮点数(小写字母e)
%E 用科学计数法表示的浮点数(大写字母E)
%g 根据数值的大小自动选择%f或%e格式
%G 根据数值的大小自动选择%f或%E格式
%c 单个字符
%s 字符串
%p 指针地址
%n 将已打印字符数保存在整型指针中
%% 打印一个百分号
转换说明在表示数字时,可指定宽度等。
%a.bf
表示最小宽度为a,小数为b位,浮点数。
c99之前,不使用//
单字符常量的类型是int
sizeof(char)等于sizeof(int)
#
开始的行是预处理命令。#define 名称 标记
名称为宏名,标记为宏体。
比如
#include
#define MYHELLO "你好,世界\n"
int main(int argc, char **argv)
{
printf(MYHELLO );
return 0;
}
#include
#define PT printf
int main(int argc, char **argv)
{
PT ("hello\n" );
return 0;
}
第二种要复杂一些,在宏体中使用括号,这叫做带参数的宏。
#include
#define PT(helloStr) printf(helloStr)
int main(int argc, char **argv)
{
PT ("hello,world\n" );
return 0;
}
格式为
#define 名称(标识符列表) 标记
标识符列表为参数列表,多个参数用,
分隔
#include
#define PT(helloStr,n) printfn(helloStr,n)
void printfn(char *helloStr,int n){
for (int i=0;i<n;i++){
printf(helloStr);
}
}
int main(int argc, char **argv)
{
PT ("hello,world\n",5 );
return 0;
}
hello,world
hello,world
hello,world
hello,world
hello,world
Hit any key to continue...
要注意防止隐含在宏中的错误。
#include
#define SUM(x1,x2,x3,n) x1*n+x2*n+x3*n
int main(int argc, char **argv)
{
printf ("%d\n",SUM(1,2,3,4) );
return 0;
}
上面程序初看没问题
运行结果也正常
但尝试给宏SUM
传入以下参数,就会遇到错误
#include
#define SUM(x1,x2,x3,n) x1*n+x2*n+x3*n
int main(int argc, char **argv)
{
printf ("%d\n",SUM(1+1,1+2,1+3,4) );
return 0;
}
27
Hit any key to continue...
结果应是2*4+3*4+4*4=8+12+16=36
下面程序才是正确的,括号是必须要加的
#include
#define SUM(x1,x2,x3,n) ((x1)*(n)+(x2)*(n)+(x3)*(n))
int main(int argc, char **argv)
{
printf ("%d\n",SUM(1+1,1+2,1+3,4) );
return 0;
}
#define
语句部分进行的,在处理宏展开时执行。