!x,就是非x,非0就是真,非其他数字就是假。就是当x为0才成立.
void main()
{
int x=3;
do
{
printf("%3d",x-=2);
}while(!(--x));
int i=3;
if(i%3)
{
printf("1");
}
else
{
printf("0");
}
//输出0,当0的时候为假
}
1 -2,第一遍while(!0),成立,继续执行。第二遍while(!-3),不成立,跳出循环
3. 优先级题int a=5,b=6,c=7,d=8,m=2,n=2; (m=a < b)&&(n=c4. 结合性,数值比较d); printf("%d",n); 输出0 int a=5,b=6,c=7,d=8,m=2,n=2; (m=a > b)&&(n=c>d); printf("%d",n); 输出2 考点:优先级,>比=高 &&,左边假,右边不执行
printf("%d", 3
5. 强制类型转换
把表达式的运算结果强制转换成类型说明符所表示的类型,只是转换了结果,变量的类型并不转换
运算符的操作数
-
单目运算符:只有一个操作数,例如:
逻辑非运算符【!】、按位取反运算符【~】、自增自减运算符【++ --】、负号运算符【-】、类型转换运算符【(类型)】、指针运算符和取地址运算符【*和&】、长度运算符【sizeof】这些是单目运算符
-
双目运算符:有两个操作数,例如:
,+,-,*,/,=,==
-
三目运算符:需要三个操作数,例如:
?:
语法
scanf
nt main()
{
int a,b,c;
printf(“input three data:n”);//使用 scanf 之前先用 printf 提示输入。
scanf("%d%d%d",&a,&b,&c); // scanf 的“输入参数”中,前面的取地址符&记住
printf("%d,%d,%d/n",a,b,c);
return 0;
}
运行时按如下方式输入三个值:
3□4□5↙(输入a,b,c的值)
3,4,5 (printf输出的a,b,c的值)
printf
printf("%.2fn",3.141592);
3.14
printf("%.3fn",3.141592);
3.142
数据类型
变量
- 一个有名字的,具有特定属性的一个存储单元,用来存放数据,可以改变。先定义(声明)后使用。
- a(3)a:变量名(不可变),3:变量值(可变),():存储单元:不能变
- 变量名实际上是以一个名字代表的一个存储地址,编译时,系统给每一给变量名分配对应的内存地址。
- 从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。。。间接访问:通过地址访问(指针),直接访问:从变量中取值
标识符,就是一个对象的名字(变量,函数)
常量
-
在那些定义中是一个常量:
1、字符常量:就是输入的字符,比如’c’就是常量,是不能改变的
2、const定义的常量:const int a = 10;
3、枚举定义的常量:enum sex{ grade, cls, num };此时当中的grade、cls、num都是常量
4、宏可以定义一个常量#define max_size = 400
-
程序运行过程中,不能被改变的值就是常量
1)整形常量,整数
2)实型常量,十进制小数形式,数字和小数点组成。指数形式(1.2e3=1.2*10^3)(e或者E之前必须有数字)
3)字符常量,普通字符,单引号括起来的一个字符,存储过程中不是存储字符,而是存储其代码。转义字符,以开头的字符序列
4)字符串常量,用双引号把若干个字符括起来,“123”,“fsfd”
5)符号常量,用#define PI 3.14 末行没有分号,经过以上处理,文件中从此行开始,PI都是3.14。符号常量不占用内存,只是一个临时符号,预编译之后就不存在了
字符型数据********,与字符串数据进行比较
- char c=‘a’; 单引号,字符不能超过四个,最好是一个字符
- putchar(c)
putchar('s');输出s
putchar(66);输出B
char ch;
ch = getchar();
putchar(ch);
输入qqq,输出q,getchar函数只能接受一个字符
数组
C语言中不可以对数组整体引用。
二维数组
- 与java相反,可以不写前面的下标,但必须写后面的。
- 每一行的列必须相同
字符数组
定义
char a[7]="dfsfwfd";
char b[7]={"dfsfwfd"};
char c[7]={'d','f','s','f','w','f','d'};
printf("%cn",c[6]);
特点
- 用双撇号括起来的部分就是字符串常量,如“abc”,"Hello!"都是字符串常量。
- 字符串常量"abc"在内存中占用4个字节(而不是3个字节),编译系统会在字符串最后自动加上一个’ ’作为字符串结束标志。但’ ’并不是字符串的一部分,它只作为字符串的结束标志。 字符串常量通常要用字符数组来存放。
- ' ’是结束字符串
if…else…,没有循环的特点
- 可以是关系表达式,逻辑表达式,算术表达式
C语言规定else总是与其前面最近的尚未配对的if语句组成配对关系。
循环
break
只能用于循环语句和switch语句
continue
- 提前结束本次循环,接着执行下次循环
函数
函数处理字符串
puts(字符数组)
- 作用:将一个字符串(以’ ’结束的字符序列)输出。
可以包含转义字符,但是’ ’还是结束,后面的字符串不输出
- 只能输出一个字符串
gets(字符数组)
- 输入一个字符串到字符数组,并且得到一个函数值,该函数值是字符数组的起始地址
- hello,不是五个字符,是六个
- 只能输入一个字符串
strcat(字符数组1,字符数组2)–字符串连接函数
- 字符串2接到字符串1后面,
- 连接前两个字符串的后面都有’ ’,连接时将字符串1后面的’ ’取消
strcpy(字符数组1,字符数组2)和strncpy
- 字符数组1必须写成数组名的形式(str1),字符数组2可以是字符数组名,也可以是一个字符串常量,strcpy(str1,“china”);
- strncpy(str1,str2,2)是将str2中最前面的两个字符复制到str1中,取代str1中原有的字符的最前面两个字符,但是复制的字符个数n不应该多于str1中原有的字符(不包括’ ’)
strcmp(字符串1,字符串2)
- 两个字符串从左到右逐个字符相比,根据ASCII码值大小比较,直到出现不同的字符或遇到’ ’为止。
- 比较的结果由函数值带回,相等返回0,1>2返回正整数,1<2返回负整数
strlen(字符数组)
- 测试字符串长度(不包括‘ ’)
- char str1[20]="hello",str2[]="world"; printf("%d",strlen(str1));,输出5
strlwr(字符串)
大写转换为小写
strupr(字符串)
小写转换为大写
函数的声明与定义的区别
-
C语言编译系统是由上往下编译的. 一般被调函数放在主调函数后面的话,前面就该有声明。正如变量必须先声明后使用一样,函数也必须在被调用之前先声明,否则无法调用!函数的声明可以与定义分离,要注意的是一个函数只能被定义一次,但可以声明多次。
-
函数声明由函数返回类型、函数名和形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。这三个元素被称为函数原型,函数原型描述了函数的接口。定义函数的程序员提供函数原型,使用函数的程序员就只需要对函数原型编辑即可。
【返回类型】 函数名(参数1类型 参数1,参数2类型 参数2,……);
函数声明中的形参名往往被忽略,如果声明中提供了形参的名字,也只是用作辅助文档。另外要注意函数声明是一个语句,后面不可漏分号!
-
声明与定义的区别:
函数的声明与函数的定义形式上十分相似,但是二者有着本质上的不同。声明是不开辟内存的,仅仅告诉编译器,要声明的部分存在,要预留一点空间。定义则需要开辟内存。
1)函数的定义
函数的定义是一个完整的函数单元:
包含函数类型、函数名、形参及形参类型、函数体等(首部?)
在程序中,函数的定义只能有一次
函数首部与花括号间不加分号
2)函数的声明
函数声明只是对编译系统的一个说明:
函数声明是对定义的函数的返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型。
不包含函数体(或形参)
调用几次该函数就应在各个主调函数中做相应声明
函数声明是一个说明语句,必须以分号结束
// 只是做个函数声明,并不用实现
int sum(int a, int b);
int main()
{
int c = sum(1, 4);
return 0;
}
// 函数的定义(实现)
int sum(int a, int b) {
return a + b;
}



