C语言数据类型和变量 二

1.数据类型

在这里插入图片描述

1.1布尔类型

_Bool 

·引入布尔类型专门表示真假,其使用需包含头文件<stdio.h>;
·其取值只能为:true和flase;
例如:

#define bool _Bool
#define false 0
#define true 1
#include<stdio.h>
int main()
{
   
	_Bool flag = true;
	if (flag)
		printf("i like C\n");
}

2.signed和unsigned

C语言是用signed和unsigned修饰字符型和整型的:
·signed表示此类型有正负;
·unsigned表示此类型无正负,只有零和正整数。

注:1.对于int型默认是有正负的,即int=signed int;
2.对于char型默认是否有正负由当前系统决定。

3.变量

创建变量的语法形式:

data_type name;
 | 			|
 | 			|
数据类型  变量名

例:

int age;
char ch;

初始化:变量创建时就给它一个初值。
例:

int age=18;
char ch='w';

4.变量分类

·全局变量:大括号外定义的变量(使用范围更广);
·局部变量:打括号内定义的变量(使用范围更局限);

注:当全局变量和局部变量同名时局部变量优先使用。

变量的存储:
在这里插入图片描述

5.算术操作符:+、-、*、/、%

·+(加)、-(减)、*(乘)、/(除)、%(取余)均为双目操作符。

5.1 /

先看一个例子:

#include <stdio.h>
int main()
{
   
 float x = 6 / 4;
 int y = 6 / 4;
 printf("%f\n", x); // 输出 1.000000
 printf("%d\n", y); // 输出 1
 return 0;
}

会发现输出的x1.000000而不是1.500000这是因为虽然xfloat类型,但计算x的式子中被除数6和除数4都是int型,得到的结果就是1.5舍去小数部分后的值,为1.000000

注:如果希望得到浮点数的结果,两个运算数(被除数和除数)必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。

5.2 %

·%表示求余运算。

注:这个运算符只能⽤于整数(包括字符型,整形与字符型互通),不能⽤于浮点数。

负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。
例:

#include <stdio.h>
int main()
{
   
 printf("%d\n", 11 % -5); // 1
 printf("%d\n",-11 % -5); // -1
 printf("%d\n",-11 % 5); // -1
 return 0;
}

6.赋值操作符:=和复合赋值

例:

int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符

6.1连续赋值

例:

int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左(接合方向)依次赋值的。

6.2复合赋值符

复合赋值符:

+= -=
*= /= %=
>>= <<=
&= |= ^=

a+=3等价于a=a+3;
a*=3等价于a=a*3;(其他复合赋值符同理)

7.单目操作符:++、–、+、-

7.1 ++和–

7.1.1 前置++

口诀:先加1,后使用。
例:

int a = 10;
int b = ++a;//b=a++等价于(a=a+1,b=a)
printf("a=%d b=%d\n",a , b);//a=11,b=11

7.1.2 后置++

口诀:先使用,后加1。
例:

int a = 10;
int b = a++;//b=a++等价于(b=a,a=a+1)
printf("a=%d b=%d\n",a , b);//a=11,b=10

7.1.3 前置–

口诀:先减1,后使用。
例:

int a = 10;
int b = --a;//b=--a等价于(a=a-1,b=a)
printf("a=%d b=%d\n",a , b);//a=9,b=9

7.1.4 后置–

口诀:先使用,后减1。
例:

int a = 10;
int b = a--;//b=a--等价于(b=a,a=a-1)
printf("a=%d b=%d\n",a , b);//a=9,b=10

7.2 +和-

此处的+就是正,-就是负。

8.强制类型转换

语法形式:

(类型)

例:

int a = 3.14;//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告

可用强制类型转换修改:

int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分;a=3

9.scanf和printf的介绍

9.1 printf

9.1.1基本用法

printf的作用是将参数文本输出到屏幕上。
例:

#include<stdio.h>
int main() 
{
   
 printf("Hello World");
 return 0;
}

会在屏幕上打印:hello world
printf的使用需包含头文件<stdio.h>

9.1.2占位符

·printf()可输出文本中指定的占位符,占位符就是此位置可用其它值代替。
·占位符的第一个字符均为%,第二个字符表示相应的类型,例:%s,%d等。
例:

#include <stdio.h>
int main()
{
   
 printf("This is a %s\n","apple");
 return 0;
}

会在屏幕打印:This is a apple

printf() 参数与占位符是⼀⼀对应关系,如果有 n 个占位符, printf() 的参数就应该有 n + 1 个。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。

9.1.3占位符列举

• %a :⼗六进制浮点数,字⺟输出为⼩写。
• %A :⼗六进制浮点数,字⺟输出为⼤写。
• %c :字符。
• %d :⼗进制整数。
• %e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。
• %E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。
• %i :整数,基本等同于 %d 。
• %f :⼩数(包含 float 类型和 double 类型)。
• %g :6个有效数字的浮点数。整数部分⼀旦超过6位,就会⾃动转为科学计数法,指数部分的 e
为⼩写。
• %G :等同于 %g ,唯⼀的区别是指数部分的 E 为⼤写。
• %hd :⼗进制 short int 类型。
• %ho :⼋进制 short int 类型。
• %hx :⼗六进制 short int 类型。
• %hu :unsigned short int 类型。
• %ld :⼗进制 long int 类型。
• %lo :⼋进制 long int 类型。
• %lx :⼗六进制 long int 类型。
• %lu :unsigned long int 类型。
• %lld :⼗进制 long long int 类型。
• %llo :⼋进制 long long int 类型。
• %llx :⼗六进制 long long int 类型。
• %llu :unsigned long long int 类型。
• %Le :科学计数法表⽰的 long double 类型浮点数。
• %Lf :long double 类型浮点数。
• %n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。
• %o :⼋进制整数。
• %p :指针。
• %s :字符串。
• %u :⽆符号整数(unsigned int)。
• %x :⼗六进制整数。
• %zd : size_t 类型。
• %% :输出⼀个百分号。

9.1.4输出格式

printf()可以定制占位符的输出格式。

9.1.4.1

printf()允许限定占位符的最小宽度。
例:

#include <stdio.h>
int main()
{
   
 printf("%5d\n", 123); // 输出为 " 123"
 return 0;
}

上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。123不满5位,对应的值的前⾯会添加空格。
输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空
格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。

9.1.4.2总显示正负号

一般, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后⾯加⼀个 +,例:%+d,其可保证输出的值总代有符号。

9.1.4.3限定小数位数

例如,希望⼩数点后⾯只保留两位,占位符可以写成 %.2f 。
例:

#include <stdio.h>
int main()
{
   
 printf("Number is %.2f\n", 0.5);//输出”0.50“
 return 0;
}

这种写法可结合前面的限定宽度使用。

9.1.4.4输出部分字符串

%s 占位符⽤来输出字符串,默认是全部输出。如果只想输出开头的部分,可以⽤ %.[m]s 指定输出
的⻓度,其中 [m] 表示输出的⻓度。

#include <stdio.h>
int main()
{
   
 printf("%.5s\n", "hello world");//其只输出”hello“
 return 0;
}

9.2 scanf

9.2.1基本用法

scanf()用于读取键盘输入。
1.scanf()语法形式与printf()类似:

scanf("%d",&i);

它的第⼀个参数是⼀个格式字符串,⾥⾯会放置占位符(与 printf() 的占位符基本⼀致),告诉编译器解读⽤⼾输⼊的数据类型。它的其余参数就是存放⽤⼾输⼊的变量,格式字符串⾥⾯有多少个占位符,就有多少个变量。

注:·变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。
·如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符。

2.scanf() 处理数值占位符时,会⾃动过滤空⽩字符,包括空格、制表符、换⾏符等。
例:

#include <stdio.h>
int main()
{
   
 int x;
 float y;
 
 // ⽤⼾输⼊ " -13.45e12# 0"
 scanf("%d", &x);
 scanf("%f", &y);
 return 0;
}

上例中, 第一个scanf() 读取数据时, %d 占位符会忽略起⾸的空格,从 - 处开始获取数据,读
取到 -13 停下来,即占位符 %d 只会读到 -13 。
第⼆次调⽤ scanf() 时,从上⼀次停⽌解读的地⽅,继续往下读取即从”.“开始读取,所以 %f 会读取到 .45e12 ,这是采⽤科学计数法的浮点数格式。后⾯的#不属于浮点数的有效字符,停止读取。

9.2.2 scanf返回值

·scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。
·如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF。
例:

#include <stdio.h>
int main()
{
   
 int a = 0;
 int b = 0;
 float f = 0.0f;
 int r = scanf("%d %d %f", &a, &b, &f);
 printf("a=%d b=%d f=%f\n", a, b, f);
 printf("r = %d\n", r);
 return 0;
}

输出结果为:

如果输⼊2个数后,按 ctrl+z ,提前结束输⼊:

在这里插入图片描述
在vs中按三次ctrl+z才能结束输入,如果⼀个数字都不输⼊,直接按3次 ctrl+z ,输出的r是-1,也就是EOF:

在这里插入图片描述

9.2.3占位符

• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会
停⽌。

1.·在上面的占位符中,除了 %c 以外,都会⾃动忽略起⾸的空⽩字符。 %c 不忽略空⽩字符。
2.·对于%s不能简单地等同于字符串。它的规则是,从当前第⼀个⾮空⽩字符开始读起,直到遇到空⽩字符(即空格、换⾏符、制表符等)为⽌。所以,scanf()不适合读取包含空格的字符串。

3.scanf() 将字符串读⼊字符数组时,不会检测字符串是否超过了数组⻓度。所以为避免产生预料之外的情况,使⽤ %s 占位符时,应该指定读⼊字符串的最⻓⻓度,即写成 %[m]s ,其中的 [m] 是⼀个整数,表⽰读取字符串的最⼤⻓度,后⾯的字符将被丢弃。
例:

#include <stdio.h>
int main()
{
   
 char name[11];
 scanf("%10s", name);
 return 0;
}

此时只会读取前10个字符,多余的字符将被舍弃。

9.2.4赋值忽略符

例:

#include <stdio.h>
int main()
{
   
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d-%d-%d", &year, &month, &day);
 return 0;
}

上⾯⽰例中,如果⽤⼾输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。但⽤⼾可能输⼊其他格式,⽐如2020/01/01 ,这种情况下, scanf() 解析数据就会失败。为了避免这种情况, scanf() 提供了⼀个赋值忽略符 * 。只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

#include <stdio.h>
int main()
{
   
 int year = 0;
 int month = 0;
 int day = 0;
 scanf("%d%*c%d%*c%d", &year, &month, &day);
 return 0;
}

相关推荐

  1. C语言-数据类型变量

    2023-12-21 13:48:01       35 阅读
  2. C#基础语法变量数据类型

    2023-12-21 13:48:01       37 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-21 13:48:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-21 13:48:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-21 13:48:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-21 13:48:01       20 阅读

热门阅读

  1. LCD12864(St7920/St7921)+超声波测距模块+STC89C52

    2023-12-21 13:48:01       35 阅读
  2. 单片机设计的开题报告应该如何书写

    2023-12-21 13:48:01       47 阅读
  3. 云端的DevOps之旅:深入了解AWS Code系列工具

    2023-12-21 13:48:01       39 阅读
  4. kotlin第三方库记录

    2023-12-21 13:48:01       30 阅读
  5. 测试理论知识三:测试用例、测试策略

    2023-12-21 13:48:01       30 阅读
  6. Linux 如何查看架构和系统

    2023-12-21 13:48:01       35 阅读
  7. 基于AES图像加解密算法的MATLAB仿真

    2023-12-21 13:48:01       32 阅读
  8. 一种带缓存DSP28335 CAN程序

    2023-12-21 13:48:01       33 阅读
  9. 安全运营之态势感知与监测

    2023-12-21 13:48:01       44 阅读