C语言数据类型和变量 二

发布时间:2023年12月21日

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;
}
文章来源:https://blog.csdn.net/2302_76561054/article/details/132735762
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。