5.3 字符常量
字符:将一个单一的非数值型数据用单引号引起来,就将其称之为一个字符。
例如:‘a’ ‘y’ ‘9’
#include <stdio.h> int main(int argc, const char *argv[]) { char a = 'w'; printf("a = %d %c\n",a,a); char b = 97; printf("b = %d %c\n",b,b); char c = 'w'; printf("c = %c\n",c); c = c-32; printf("c = %c\n",c); return 0; }
5.4 字符串常量
将一个或者多个字符通过双引号引起爱,将其称之为一个字符串,每一个字符串的结尾都会自动加一个’\0’
例如:“Helloworld” “a” “abc” “1234”;
注意:
a 是一个变量
‘a’:是一个字符常量,占一个字节
“a”:是一个字符串常量,占两个字节
#include <stdio.h> int main(int argc, const char *argv[]) { //定义一个字符数组保存字符串 char str[32] = "hello world"; //使用%s来输出一个字符串 printf("str = %s\n",str); //遇到\0表示字符串结束 char str1[32] = "hello wo\0rld"; printf("str1 = %s\n",str1); return 0; }
5.5 标识常量 ----宏定义
将一个常量或者常量表达式标识成另一个标识符,使用这个标识符就相当于使用这个常量或者常量表达式,也将其称之为宏定义,这个标识符一般使用大写字母表示,并且要满足标识符的命名规则。
格式:
#define 标识符 常量或者常量表达式 例如: #define N 32
#include <stdio.h> #define M 128 #define N 32 #define SUM M+N #define SUM1 (M+N) #define SUB(a,b) (a-b) int main(int argc, const char *argv[]) { int i = M + 5; printf("i = %d\n",i); int a = N +M; printf("a = %d\n",a); int b = SUM + 100; printf("b = %d\n",b); //128 + 32 * 10 int c = SUM*10; printf("c = %d\n",c); //(128 + 32) *10 int d = SUM1 *10; printf("d = %d\n",d); int e = SUB(10,5) + 100; printf("e = %d\n",e); return 0; }
六、变量
6.1 概念
变量,就是我们自己定义的变量名,变量就是可以改变其值的量,变量就是一个标识符,所以需要满足标识符的命令规则。
在程序的运过程中,变量占据一定的内存空间,其大小由变量数据类型来决定的
例如:
int a;//变量a在内存中占四个字节 char b;//在内存中就分配一个字节 #include <stdio.h> int main(int argc, const char *argv[]) { //定义一个变量 int i; //变量的初始化,在定义变量的同时赋值 int a = 100; int b; //变量赋值,这个变量已经定义好之后再赋值 b = 200; //注意:在同一个{}内,同一个变量名不能定义两次 //long b = 88; a = 888; b = 999; //变量和变量之间可以赋值 //等号左边叫做左值,等号右边叫做右值,是将右值赋值给左值 //右值不会发生改变 i = a; return 0; }
6.2 变量定义格式
格式: 存储类型 数据类型 变量; 存储类型:有四种 auto:默认不写就是这个类型 register static extern 数据类型:就是我们之前学习的char,int等 变量名:就是起名字,是一个标识符
6.3 类型转换
原本的变量在使用的额过程中需要改变他的类型,转换之后这个变量的类型以及存储空间都会发生改变。
类型转换的方法:
隐式类型转换:是操作系统或者编译器自动进行转换的
显示类型转换:又称之为强制类型转换,是我们人为直接转换的
显示的数据类型转换一般形式为:
(数据类型名称)<表达式>
#include <stdio.h> int main(int argc, const char *argv[]) { //隐式类型转换:当float类型赋值给int类型的时候,就会将a临时转换成int再赋值给b //隐式类型转换默认一从低精度往高精度转 float a = 3.14; int b = a; printf("b = %d\n",b); int i= -20; unsigned int j = 6; if(i + j > 0) { printf("i + j > 0,%u\n",i+j); } else { printf("i + j <= 0"); } int m = 10,n = 4; //printf("%d\n",m/n); printf("%f\n",(float)m/n); printf("%f\n",(float)m/(float)n); return 0; }
强制类型转换注意事项:
强致类型转换后面的表达式如果存在复杂运算,一定
七、运算符
7.1 算术运算符
双目运算符:运算符的两边各有一个变量
± * / %
单目运算符:运算符边上只有一个变量
++ –
%:取余,只能用在整数,浮点数据不能取余
++:自增,每次自增1
–:自减,每次自减1
7.2 关系运算符
< >= <= == !=
#include <stdio.h> int main(int argc, const char *argv[]) { int a = 10,b = 20,c; //使用关系运算符的表达式的结果是一个bool类型 //表达式为真,则结果为1,表达式为假,结果为0 c = a > b; printf("c =%d\n",c); c = a < b; printf("c =%d\n",c); if(a > b) { printf("hello world!\n"); } else { printf("hello nanjing\n"); } return 0; }
7.3 逻辑运算符
逻辑运算符主要是用于连接多个有关系运算符连接的表达式,判断整体表达式为真为假
!:逻辑反,原本表达式为真变为假,为假则变为真
!(A > B) ====> A <= B
&&:逻辑与,两个表达式都为真才为真,只要有一个为假则整体为假
||:逻辑或,有一个为真则整体为真,除非都为假才为假
判断一个变量a的值是否在10-20的范围内:
数学:10 <=a <=20;
c语言:a >=10 && a <= 20
判断一个变量a的值是否不在10到20的范围内:
数学:a < 10 或 a > 20
c语言:a < 10 || a > 20
#include <stdio.h> int f1() { printf("this is f1\n"); return 0; } int f2() { printf("this is f2\n"); return 1; } int main(int argc, const char *argv[]) { /* int a = 100,b; //b = 10 <=a <=20; b = a >=10 && a <= 20; printf("b = %d\n",b); */ int a = 1,b = 0; if(f1() && f2()) //短路原则:如果条件1不成立,则不会判断条件2 { printf("hello world!\n"); } if(a && b) //两个表达式都要成立 { printf("hello tianjing!\n"); } if(a ||b) //逻辑或,有一个表达式成立就行 { printf("a || b成立!\n"); } return 0; }
7.4 位运算
但凡涉及到位操作,一定先将这个数转化为二进制数,然后再操作
位逻辑反
& 位逻辑与,同为1则为1,否则为假, 1&1 = 1 ,1&0 = 0 ,0 &0 = 0
| 位逻辑或,只要有一个为1则为1
^ 位逻辑异或,相同为0,不同为1 1^0 = 1 ,0^0 = 0 ,1^1 = 0
<< 左移 >> 右移
#include <stdio.h> int main(int argc, const char *argv[]) { unsigned char m = 0xa7,n = 0x3b; unsigned char k; //逻辑反 k = ~m; //m:1010 0111 //~m:0101 1000 = 0x58 printf("k = %#x\n",k); k = m & n; //m: 1010 0111 //n: 0011 1011 //m&n: 0010 0011 = 0x23 printf("k = %#x\n",k); //左移 k = m << 3; //m:1010 0111 //m:0011 1000->0x38 printf("k = %#x\n",k); //右移 k = n >> 3; //n: 0011 1011 //n >>3:0000 0111-->0x07 printf("k = %#x\n",k); return 0; }
7.5 赋值运算符和赋值符合运算符
赋值运算符:=
左值 = 右值
注意:左值必须是变量,右值可以是变量也可以是常量
注意事项:
=:表示赋值
==:表示判断是否相等
赋值复合运算符:
a = a+b------>a+=b;
a^=b
a>>=b—>a = a >> b
7.6 条件运算符—三目运算符
语法格式:
表达式1?表达式2:表达式3
运行顺序:
先执行表达式1,如果表达式1为真则执行表达式2,如果表达式1为假,则执行表达式3
条件运算符其实就是一个简单的if…else语句
if(表达式1) { 表达式2 } else { 表达式3 }
#include <stdio.h> int main(int argc, const char *argv[]) { int a = 100,b = 20,c; c = a > b ? ++a : b++; printf("a = %d,b = %d,c = %d\n",a,b,c); return 0; }
7.7 逗号运算符
语法格式:
a = (表达式1,表达式2,表达式3,表达式4);
执行顺序:
括号里面的表达式从左往右依次执行,最终整个表达式的结果是最后一个表达式的结果
注意:
逗号运算符必须使用括号
#include <stdio.h> int main(int argc, const char *argv[]) { int a = 100,b = 40,c; //c = (++a,++b,a = a+b,a++); printf("a = %d,b = %d,c = %d\n",a,b,c); c = a+++b; //c = a+++(++b); printf("a = %d,b = %d,c = %d\n",a,b,c); return 0; }
7.8 sizeof运算符
sizeof是一个关键字,也是一个运算符,主要用于获取一个数据类型或者变量所占内存的大小
语法格式:
n = sizeof(数据类型或者变量名)
n:用于保存这个数据类型或者变量名所在内存的字节数
例如:n = sizeof(int) —>n = 4;
#include <stdio.h> int main(int argc, const char *argv[]) { _Bool a; char b; short c; int d; long e; float f; double g; long long h; printf("sizeof(_Bool) = %ld %ld\n",sizeof(_Bool),sizeof(a)); printf("sizeof(char) = %ld %ld\n",sizeof(char),sizeof(b)); printf("sizeof(short) = %ld %ld\n",sizeof(short),sizeof(c)); printf("sizeof(int) = %ld %ld\n",sizeof(int),sizeof(d)); printf("sizeof(long) = %ld %ld\n",sizeof(long),sizeof(e)); printf("sizeof(float) = %ld %ld\n",sizeof(float),sizeof(f)); printf("sizeof(double) = %ld %ld\n",sizeof(double),sizeof(g)); printf("sizeof(long long) = %ld %ld\n",sizeof(long long),sizeof(h)); return 0; }
编程练习
题目1:一个水分子的质量约为3.0*10^-23g,1L水大约950g,编写一个程序,要求输入水的升数,然后显示这么多升水中包含多少个水分子。
#include <stdio.h> #define MOL_MASS 3.0e-23 #define QT_MASS 950 int main(int argc, const char *argv[]) { float water,quarts,molecules; printf("MOL_MASS = %e\n", MOL_MASS); printf("Please enter number of the quart of water: "); scanf("%f",&quarts); water = quarts * QT_MASS; //计算水的质量 molecules = quarts * QT_MASS / MOL_MASS; //计算水分子的数量 printf("quarts = %f quart\n",quarts); printf("water = %f g\n",water); printf("molecules = %e(%f)\n",molecules,molecules); putchar('\n'); return 0; }
练习2:输入一个三位数,求个位,十位,百位的和
789—> 7 + 8 + 9 789 /100 = 7 789 %10 = 9 789 %100 /10 = 8 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main(int argc, const char *argv[]) { int num; printf("请输入一个三位数:\n"); scanf("%d",&num); if(num > 999 || num < 100) { exit(0); } int ge,shi,bai,sum; ge = num % 10; shi = num % 100 /10; bai = num / 100; sum = ge + shi + bai; printf("sum = %d\n",sum); return 0; }
练习3:输入两个数,实现这两个数的交换
int m,n; scanf("%d %d",&m,&n); m = 100,n = 50; … m = 50,n = 100; #include <stdio.h> int main(int argc, const char *argv[]) { printf("请输入两个数:\n"); int m,n; scanf("%d %d",&m,&n); printf("交换前:m = %d,n = %d\n",m,n); #if 1 int tmp; tmp = m; m = n; n = tmp; #else m = m+n; n = m-n; m = m-n; #endif printf("交换后:m = %d,n = %d\n",m,n); return 0; }