typedef 允许你为各种数据类型定义新的名字。
typedef char *pchar 这个声明把标识符pchar作为指向字符的指针类型的新名字。
pchar a;声明a是一个指向字符的指针。
注意:应该使用typedef而不是#define来创建新的类型名。因为后者无法处理指针类型。
例如:# define ptr_to_char char *
ptr_to_char a,b;正确声明a为一个指向字符的指针,但b被声明为一个字符。
int *pi pi是一个普通的指向整型的指针
int const *pci 则是一个指向整型常量的指针。你可以修改指针的值,但不能修改指针所指向的值。
int * const cpi cpi是一个指向整型的常量指针。此时指针是常量(必须在定义时初始化),它的值无法修改,但可以修改它所指向的整型的值。
int const * const cpci 无论指针本身还是它所指向的值都是常量,不能被修改。
4.1.1关系运算符与关系表达式
比较两个量的运算符称为关系运算符。在C语言中有以下关系运算符:
< 小于 <= 小于或等于 > 大于 >= 大于或等于 == 等于 != 不等于
说明:
1)关系运算符都是双目运算符,其结合性均为左结合性
2)关系运算符的优先级低于算术运算符,高于赋值运算符。
3)在关系运算符中 < <= > >=优先级相同,高于== !=,==和!=优先级相同。
4.1.2 关系表达式
用关系运算符将表达式链接起来的式子称为关系表达式。
表达式的结果只有两种:真(1)和假(0)。在进行比较时,非0的值代表为真,0的值代表为假。
4.2.1逻辑运算符
C语言中提供的逻辑运算符有3种: && 逻辑与运算符 || 逻辑或运算符 !逻辑非运算符
说明:
1)!为单目运算符,&&和||为双目运算符。
2)&&和||具有左结合性,!具有右结合性。
3)逻辑运算符的优先级关系:!--->&&--->|| &&和||低于关系运算符 !高于算术运算符
4.2.2逻辑表达式
用逻辑运算符将表达式链接起来的式子称为逻辑表达式。
表达式的结果也只有两种:真(1)和假(0)。在进行比较时,非0的值代表为真,0的值代表为假。
&& 逻辑与运算符参与运算的两个量都为真时,&&结果才为真,否则为假。 多个&&运算时,第一个为假就可以确定此表达式最后结果肯定为假,所以可以忽略后面的&&运算。
||逻辑或运算符参与运算的两个量有一个为真时,||结果才为真 否则为假。 多个||运算时,第一个为真就可以确定此表达式最后的结果肯定为真,所以可以忽略后面的||运算
1)判断某一年year是否是闰年的表达式为:(闰年的条件:year能被4整除的同时不能被100整除;或者year能被4整除,又能被400整除) 闰年366天 2月29天
(year % 4 == 0 && year % 100 != 0)||year % 400 == 0 结果为真时,year为闰年,否则为非闰年
2)判断某个字符C是不是字母的表达式:
(c >= 'A' && c <= 'Z')||(c >= 'a' && c <= 'z') 按字符比较
或 (c >= 65 && c <= 90)||(c >= 97 && c <= 122) 按字符的ASCII码值比较
4.3.1 if语句的三种形式
1.单分支if语句
格式:if(表达式) 语句
功能:如果表达式的值为真,则执行其后的语句,否则不执行该语句。
说明:1)圆括号内的表达式一般为逻辑表达式或关系表达式,但也可以是其它表达式。
2)语句可以是任意一条有效的执行语句或复合语句,也可以是另一个if语句
2.双分支if语句
格式:if(表达式)
语句1;
else
语句2;
功能:如果表达式结果为真,则执行语句1,否则执行语句2。
说明:1)如果语句1或语句2的语句多于一条时,必须用{ }将其括起来。
2)else不能单独出现,必须与if配对使用。
3)书写时一般将else及后面的语句另起一行,并且让else与它所对应的if对齐。
例题1:任意输入一年份判断此年是否为闰年。
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4
5 void main()
6 {
7 int year;
8 scanf("%d", &year);
9 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
10 printf("%d 是闰年
", year);
11 else
12 printf("%d 不是闰年
", year);
13 system("pause");
14 }
例题2.任意输入一个字符,判断它是否为大写字母,如果是,将它转换成小写字母;如不不是,不转换。
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4
5 void main()
6 {
7 char ch = getchar();
8
9 if (ch >= 'A' && ch <= 'Z')
10 {
11 putchar(ch + 32);
12 putchar('
');
13 }
14 else
15 {
16 putchar(ch);
17 putchar('
');
18 }
19
20 //(ch >= 'A' && ch <= 'Z') ? ch = ch + 32 : (ch >= 'a'&&ch <= 'z') ? ch = ch - 32 : ch;
21 //printf("%c", ch); 如果是大写字母转小写字母;如果是小写字母转大写字母
22
23 system("pause");
24 }
3.多分枝if语句
格式:if(表达式1)
语句1;
else if(表达式2)
语句2;
else if(表达式3)
语句3;
……
else if(表达式m)
语句m;
else
语句n;
功能:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个if语句之外继续执行。如果所有表达式均为假,则执行语句n。然后继续执行后续程序。
4.3.2 if语句的嵌套
C语言规定,else总是与它前面最近的if配对。
例题1.从键盘输入3个数作为三角形的一条边,判断是否能够成一个三角形,若能,请判断是等边、等腰、直角三角形还是一般的三角形。
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4
5 void main()
6 {
7 int a, b, c;
8 printf("请输入三个数据:");
9 scanf("%d%d%d", &a, &b, &c);
10
11 if (a + b > c&&a + c > b&&b + c > a)
12 {
13 printf("能构成一个三角形
");
14 if (a == b&&b == c) printf("能构成一个等边三角形
");
15 else if
16 (a == b || b == c || a == c) printf("能构成一个等腰三角形
");
17 else if
18 (a*a + c*c == b*b || a*a + b*b == c*c || b*b + c*c == a*a) printf("能构成一个直角三角形
");
19 else
20 printf("能构成一个普通的三角形
");
21 }
22 else
23 printf("不能构成一个三角形
");
24
25 system("pause");
26 }
4.4 switch语句
switch语句是一条多分枝选择语句。
1.语法形式:
switch(表达式)
{
case 常量表达式1: 语句1;break;
case 常量表达式2: 语句2;break;
……
case 常量表达式n: 语句n;break;
default:语句 n + 1;
}
功能:计算表达式的值,并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句。如果语句后没有break,就不再进行判断,继续执行后面所有case后的语句;如果有break,则执行当前语句后跳出所在的switch语句。如表达式的值与所有case后的常量表达式均不相同,则执行default后的语句。
说明:
1)在case后的各常量表达式的值不能相同,否则会出错。
2)在case后允许有多个语句,可以不用{ }括起来。
3)各case和default子句的先后顺序可以变动,而不会影响其执行结果。
4)default字句可以省略不写。
C语言中三目运算符返回是值 C++中三目运算符返回是变量
malloc在C中必须强转 C++中可以不强转 C中struct不可以有函数 C++可以有
C中struct声明变量必须加strcut 关键字 C++中可以不加struct关键字
C中const修饰的变量是伪常量,编译器会分配内存。 C++中const不会分配内存,会临时开辟一块内存。
例题1.输入一个字符,判断它如果是小写字母输出其对应大写字母;如果是大写字母输出其对应小写字母;如果是数字输出数字本身;如果是空格,输出“space”;如果不是上述情况,输出“other”。
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4
5 void fun(char ch)
6 {
7 if (ch >= 'A'&&ch <= 'Z')
8 putchar(ch + 32);
9 else if (ch >= 'a'&&ch <= 'z')
10 putchar(ch - 32);
11 else if (ch == ' ')
12 printf("space");
13 else if (ch >= 48 && ch <= 57)
14 putchar(ch);
15 else
16 printf("other");
17 }
18
19 void main()
20 {
21 char a;
22 printf("请输入一个字符:");
23 scanf("%c", &a);
24 fun(a);
25
26 system("pause");
27 }
例题2.有三个数a、b、c,由键盘输入,输出其中最大的数和最小的数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void main()
{
double a, b, c, max, min;
printf("please input three numbers:");
scanf("%lf%lf%lf", &a, &b, &c);
if (a > b) { max = a; min = b; }
else { max = b; min = a; }
if (max < c) max = c;
if (min > c) min = c;
printf("max = %lf min = %lf", max, min);
system("pause");
}
例题3.读入1到7之间的某个数,输出表示一星期中相应的某一天的单词:Monday、 Tuesday等等,用switch语句做。
1 #define _CRT_SECURE_NO_WARNINGS
2 #include<stdio.h>
3 #include<stdlib.h>
4
5 void main()
6 {
7
8 int a;
9 printf("please input integer number:
");
10 scanf("%d", &a);
11
12 switch (a){
13 case 1:printf("Monday");break;
14 case 2:printf("Tuesday");break;
15 case 3:printf("Wednesday");break;
16 case 4:printf("Thursday");break;
17 case 5:printf("Firday");break;
18 case 6:printf("Saturday");break;
19 case 7:printf("Sunday");break;
20 default:printf("Error");
21 }
22
23 system("pause");
24 }
例题4. 给出一百分制成绩,要求输出成绩等级‘A’,‘B’,‘C’,‘D’,‘E’,90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a;
printf("please input score:
");
scanf("%d", &a);
a = a / 10;
switch (a)
{
case 0:case 1:case 2:case 3:case 4:
case 5:
printf("E");break;
case 6:
printf("D");break;
case 7:
printf("C");break;
case 8:
printf("B");break;
case 9:
printf("A");break;
default:printf("Error");
system("pause");
}