第2讲:C语言数据类型和变量
第一部分
数据类型是用来创建变量的
为什么要编写程序?为了解决生活中的问题!
将生活中的数据使用计算机语言,结合数据类型与变量描述。
1. 数据类型介绍
布尔类型头文件 <stdbool.h>
布尔类型变量的取值是:true或者false
C语言原来并没有为布尔值单独设置⼀个类型,而是使用整数 0 表示假,非零值表示真
#include <stdio.h>
#include <stdbool.h>
int main()
{
_Bool flag = true;//格式?首字母大写
if (flag)//if括号里表判断,真假
{
printf("0000");
}
return 0;
}
区分sizeof与strlen
联系:都可以计算长度
区别:
sizeof的对象为数据类型或表达式,
单位为字节,表示所占内存的大小,返回值为size_t
size_t是一种无符号的整数,这种整数值在打印的时候,使用%zd
#include <stdio.h>
int main()//sizeof中表达式不计算,回顾????
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b + 1));
printf("s = %d\n", s);
return 0;
}
strlen的对象为字符串,统计的是字符串中\0之前的,单位是字符的个数
#include <stdio.h>
#include <string.h>
int main()// 将abc以两种不同的形式存入数组,并打印输出及字符串长度
{
char arr1[] = "abc";//字符串以\0作为结束标志
char arr2[] = { 'a','b','c' };//三个单独的字符
printf("%s\n", arr1);//数组打印输出时,说明变量名即可,无需指出数组的大小
printf("%s\n", arr2);
printf("%zd\n", strlen("arr1"));//strlen求字符串长度时,括号内需使用双引号,头文件为<string.h>
printf("%zd\n", strlen("arr2"));
return 0;
}
2. signed 和 unsigned
3. 数据类型的取值范围
4. 变量
#include <stdio.h>//当局部变量和全局变量同名的时候,局部变量优先使⽤。
int sss = 22;
int main( )
{
int sss = 33;
printf("%d\n", sss);
return 0;
}
第二部分
5. 算术操作符:+、-、*、/、%
/
除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。
C语言里面的整数除法是整除,只会返回整数部分,丢弃小数部分。
#include <stdio.h>//求平均生活费
int main( )//程序设计思维:一设二列三解四答
{
int shenghuofei = 2004;//一设:定义并初始化变量
double pinjun = 0;
pinjun = (shenghuofei / 20.4);//二列:结合各类操作符,列出各个变量间的关系及整体逻辑框架
//三解:交给计算机处理
printf("%.2lf", pinjun);//四答:将处理所得的结果,使用占位符按自己想要的数据类型输出
//占位符与变量的数据类型必须匹配
return 0;
}
如果希望得到浮点数的结果,两个运算数必须至少有⼀个浮点数,这时C语言就会进行浮点数除法。
float与int只是将整数分别以不同的数据类型输出罢了;输出时,占位符与变量的数据类型必须匹配。
%
运算符 % 表示求模运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。
负数求模的规则是,结果的正负号由第一个运算数的正负号决定。
#include <stdio.h>
int main()
{
int t = -8 % 3;
printf("%d\n", t);
return 0;
}
6. 赋值操作符:= 和复合赋值
复合操作符=赋值操作符+算术操作符
7. 单目操作符:++、–、+、-
前置就是先操作(+/-),再赋值使用的意思
#include <stdio.h>
int main()
{
int a = 77;
int b = ++a;
printf("%d %d", a, b);
}
后置就是先赋值使用,后操作(+/-)的意思
#include <stdio.h>
int main()
{
int a = 77;
int b = a++;
printf("%d %d", a, b);
}
第三部分
8. 强制类型转换
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
9. printf和scanf介绍
printf
占位符的第一个字符一律为百分号 % ,第二个字符表示占位符的类型,
%d 表示这里代入的值必须是⼀个整数,占位符与变量的数据类型必须匹配。
#include <stdio.h>
int main()//输出⽂本⾥⾯可以使⽤多个占位符。
{
printf("%s 的生日是%d年%d月%d日", "liu", 2003, 8, 15);
return 0;
}
传参:以不变应万变,万变不离其宗。
//最⼩宽度和⼩数位数这两个限定值,都可以⽤* 代替,通过 printf() 的参数传⼊。
#include <stdio.h>
int main()
{
printf("%s 的体重是%*.*fKG ", "liu",4,2,65.235);
return 0;
}
scanf
当我们有了变量,我们需要给变量输入值就可以使用 scanf 函数,
如果需要将变量的值输出在屏幕上的时候可以使用 prinf 函数。
如何给变量输入值?
scanf() 函数用于读取用户的键盘输入,
程序运行到这个语句时,会停下来,等待用户从键盘输入。
用户输入数据、按下回车键后, scanf() 就会处理用户的输入,将其存入变量。
#include <stdio.h>//输入并输出成绩
int main()
{
int score = 0;
printf("please enter the score:");
scanf("%d", &score);//不可加\n,否则无法执行程序。
printf("the score is %d\n", score);
return 0;
}
注意:变量前面必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址,
即将变量 i 的地址指向用户输入的值。如果这里的变量是指针变量(比如字符串变量),那就不用加 & 运算符。
scanf连续处理多个占位符
scanf() 处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。
#include <stdio.h>//scanf连续处理多个占位符,⽤⼾输⼊ " -13.45e12# 0"
int main()
{
int x = 0;
float y = 0;
printf("please enter the date:");
int a = scanf("%d %f", &x, &y);
//scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。
printf("x = %d ,y = %f\n", x, y);
printf("a = %d",a);//输出时,切勿忘记输入与占位符相对应的变量
//占位符与变量的数据类型必须匹配
return 0;
}
占位符 %s
特别说一下占位符 %s ,它其实不能简单地等同于字符串。
它的规则是,从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。
#include <stdio.h>
int main()
{
char money[8] ;
printf("plese enter the money:");
scanf("%7s",&money);
//使⽤% s 占位符时,应该指定读⼊字符串的最⻓⻓度,即写成% [m]s
printf("the is %s", money);
return 0;
}
%s 不会包含空白字符,所以无法用来读取多个单词,除非多个 %s 一起使用。
scanf() 不适合读取可能包含空格的字符串,比如书名或歌曲名。
占位符%c
1.所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符。
%c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格。
2.如果要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch) ,
即 %c 前加上一个空格,表示跳过零个或多个空白字符。
赋值忽略符
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
//只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。
printf("%d %d %d\n", year, month, day);
return 0;
}