C++笔记day3-变量常量和数据类型

139 阅读6分钟

类型限定符

extern:

表示声明。 没有内存空间。 不能提升。

const:

限定一个变量为只读变量。

volatile:

防止编译器优化代码。

volatile int flg = 0; 

register:

定义一个寄存器变量。没有内存地址。

register int a = 10;	

字符串:

C语言中,用双引号引着的一串字符,称之为字符串。一定有一个结束标记'\0'

char ch = ‘A’;  一个字节

"abc"  --> 'a''b''c''\0'

‘a’ 不等价 “a”('a''\0'

printf函数:

%s:打印字符串, 挨着从字符串的第一个字符开始打印,打印到'\0'结束。

%d:打印整数

%c:打印字符

%x:打印16进制数

%u:打印无符号

%m.n: 打印实型时用到,一共有 m 位(整数、小数、小数点),n位小数。

%0m.nf: 其中 f:表示打印实型,一共有 m 位(整数、小数、小数点),n位小数。 0:表示不足 m 位时,用0凑够m位。

%%: 显示一个%。 转义字符'\' 对 % 转义无效。

%Ns:显示N个字符的字符串。不足N用空格向左填充。

%0Ns:显示N个字符的字符串。不足N用0向左填充。

%-Ns:显示N个字符的字符串。不足N用空格向右填充。

putchar函数:

输出一个 字符 到屏幕。

直接使用 ASCII 码。

不能输出字符串。

‘abc’既不是一个有效字符,也不是一个有效字符串。

常用putchar('\n');来打印换行。

printf("\n");
    

示例

#include <stdio.h>

int main(void) 
{
	char ch = 'a';

	printf("ch = %c\n", ch);

	char str[] = "hello world";

	printf("str = %s\n", str);

	putchar(67);
}

scanf函数:

从键盘接收用户输入。

1. 接收 整数 %d

	int a, b, c;  创建变量空间, 等待接收用户输入。

	scanf("%d %d %d", &a, &b, &c);

2. 接收 字符 %c

	char a, b, c;

	scanf("%c %c %c", &a, &b, &c);

3. 接收 字符串 %s

	char str[10];	// 定义一个数组,用来接收用户输入的 字符串。

	scanf("%s", str);	// 变量名要取地址传递给 scanf, 数组名本身表示地址,不用 & 符。

接收字符串:

	1) scanf 具有安全隐患。如果存储空间不足,数据能存储到内存中,但不被保护。【空间不足不要使用】

	2) scanf 函数接收字符串时, 碰到 空格 和 换行 会自动终止。不能使用 scanf 的 %s 接收带有空格的字符串。

	
将 #define _CRT_SECURE_NO_WARNINGS  添加到程序 第一行。 解决scanf 4996错误

示例

#define _CRT_SECURE_NO_WARNINGS //visual禁用了scanf函数,如果恢复需要有这句
#include <stdio.h>

int main(void)
{
	int a;
	scanf("%d",  & a); //&表述取出变量a的地址,描述a的空间
	printf("a = %d\n", a);


	char ch1,ch2,ch3; //连续定义同类型多个变量
	scanf_s("%c %c %c", &ch1,1,&ch2,1,&ch3,1); //visual 建议用scanf_s函数,相比之前多了参数表明最多接收几位字符
	printf("ch1 = %c\n", ch1);
	printf("ch2 = %c\n", ch2);
	printf("ch3 = %c\n", ch3);

	char a[5]; //大小为5字节的数组
	scanf("%s", a); //接收用户键盘输入,写入数组a中;数组本身是地址;
	printf("a = %s\n", a);

	return 0;
}

getchar()函数:

从键盘获取用户输入的 一个字符。

返回该获取的字符的 ASCII 码。

示例

#include <stdio.h>

int  main(void)
{
	char ch;
	ch = getchar();

	printf("ch = %c\n", ch);
	
	return 0;
}

算数运算符:

先 * / % 后 + -

除法运算后,得到的结果赋值给整型变量时,取整数部分。

除0 :错误操作。不允许。

对0取余:错误操作。不允许。

不允许对小数取余。余数不能是 小数。 35 % 3.4;

对负数取余,结果为余数的绝对值。10 % -3;  --》 1

++ 和 --:

前缀自增、自减:

	先自增/自减, 在取值。

	int a = 10;

	++a;		// a = a+1;

后缀自增、自减:

	int a  = 10;

	a++;		// a = a+1;

	先取值, 再自增/自减。

赋值运算:

int a = 5;

a += 10;  // a = a+10;

a -= 30;  // a = a-30;

a %= 5;	  // a = a % 5;

比较运算符:

== 判等。

!= 不等于.

< 小于

<= 小于等于	

> 大于

>= 大于等于


13 < var < 16; ==> var > 13 && var < 16;

逻辑运算符:

0为假,非0为真。(1)

逻辑非:!

	非真为假, 非假为真。

逻辑与: &&(并且)

	同真为真,其余为假。

逻辑或:|| (或)

	有真为真。同假为假。

运算符优先级:

[]() > ++ -- (后缀高于前缀) (强转) sizeof > 算数运算(先乘除取余,后加减)> 

比较运算 > 逻辑运算 > 三目运算(条件运算)> 赋值运算 > 逗号运算	

1.png

2.png

三目运算符: ? :

表达式1 ? 表达式2 : 表达式3

表达式1 是一个判别表达式。 如果为真。整个三目运算,取值表达式2。

			 如果为假。整个三目运算,取值表达式3。

默认结合性。自右向左。

示例

#include <stdio.h>

int main(void)
{
	int a = 40;
	int b = 4;

	int m = a > b ? 69 : a < b ? 3 : 5;//嵌套的三目运算,默认结合性自右向左;
	// 实际使用最好用括号: int m = a > b ? 69 : (a < b ? 3 : 5);
	printf("m = %d\n", m);

	printf("%d\n", a > b ? 69 : 100);

	//逗号运算符

	int a1 = 10, b1 = 20, c1 = 30;
	int x = (a1 = 1, b1 = 2, c1 = 5); //逗号运算符,x被最后一个赋值;
	printf("x = %d\n", x);
	printf("a = %d\n", a1);
	printf("b = %d\n", b1);
	printf("c = %d\n", c1);

}

类型转换:

隐式类型转换:

	由编译器自动完成。

	由赋值产生的类型转换。 小--》大 没问题。 大 --》 小 有可能发生数据丢失。

	int r = 3;

	float s = 3.14 * r * r;

	321:	256 128 64 32 16 8 4 2 1
		1   0   1  0  0  0 0 0 1 

	char ch  = 0   1  0  0  0 0 0 1 	

3.png

强制类型转换:

	语法:	(目标类型)带转换变量

		(目标类型)带转换表达式

	大多数用于函数调用期间,实参给形参传值。

示例

#include <stdio.h>

int main(void) 
{
	int a = 321;
	
	char ch = a; //转换的时候发生数据丢失,高位丢失了;

	printf("ch = %d\n", ch);

	float price = 3.6;
	int weight = 4;

	double sum = (int)price * weight;
	
	printf("价格:%f\n", sum);
}

if分支语句:匹配一个范围.属于模糊匹配.

if (判别表达式1)
{
	
	判别表达式为真,执行代码。
}
else if(判别表达式2)
{
	判别表达式1为假,并且判别表达式2,执行代码。

}
else if(判别表达式3)
{
	判别表达式1为假,判别表达式2为假,判别表达式3, 执行代码。
}
。。。
else
{
	以上所有判断表达式都为假, 执行代码。
}

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main(void)
{
	int a = 10;
	//scanf("%d", &a);
	
	if (a > 0) 
	{
		printf("a > 0\n");
	}
	else
	{
		printf("a < 0\n");
	}

	int score; 
	printf("请输入用户成绩:");
	scanf("%d", &score);

	if (score >=90 && score <=100)
	{
		printf("优秀\n");
	}
	else if (score >= 80 && score < 90)
	{
		printf("良好\n");
	}
	else if (score >= 70 && score < 80)
	{
		printf("中等\n");
	}
	else if (score >= 60 && score < 70)
	{
		printf("及格\n");
	}
	else
	{
		printf("不及格\n");
	}
}

练习:三只小猪称体重:

屏幕输入三只小猪的重量。借助if分支语句,找出最重的小猪重量。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>


int main(void) 
{
	int p1, p2, p3;
	scanf("%d %d %d", &p1, &p2, &p3);

	if (p1 > p2)  //满足说明p1最重
	{
		if (p1 > p3) 
		{
			printf("p1最重");
		}
		else
		{
			printf("p3最重");
		}
	}
	else 
	{
		if (p2 > p3) 
		{
			printf("p2最重");
		}
		else
		{
			printf("p3最重");
		}

	}
}

switch 分支:精确匹配.

switch(判别表达式)
{
	
	case 1:
		执行语句1break;			// 防止case穿透

	case 2:
		执行语句2;
		break;

	case 3:
		执行语句3;
		break;
	...

	case N:
		执行语句N;
		break;

	default:
		其他情况的统一处理;
		break;
}

case 穿透:

	在一个case分支中如果,没有break;那么它会向下继续执行下一个case分支.

示例

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	int score;
	scanf("%d", &score);

	switch (score/10)
	{
	case 10:
		printf("优秀\n"); 
		break; //防止case穿透
	case 9:
		printf("优秀\n");
		break;
	case 8:
		printf("良好\n");
		break;
	case 7:
		printf("中等\n");
		break;
	case 6:
		printf("及格\n");
		break;
	default:
		printf("不及格\n");
		break;
	}

while循环:

while(条件判别表达式)
{

	循环体.
}

练习:敲7:1--100数数, 逢7和7的倍数,敲桌子。

7的倍数:	num % 7 == 0

个位含7:	num % 10 == 7

十位含7:	num / 10 == 7

示例

#include <stdio.h>

int main(void)
{
	int num =1;

	while (num <= 100)
	{
		if ((num % 7 == 0) || (num % 10 == 7) || (num / 10 == 7)) 
		{
			printf("%d敲桌子", num);
		}

		num++;

	}
}

do while 循环:

无论如何先执行循环体一次。然后在判断是否继续循环。

do {

	循环体

} while (条件判别表达式);

示例

#include <stdio.h>

int main(void)
{
	int a = 1;

	do
	{

		a++;
		printf("a = %d\n", a);

	} while (a < 10);

	return 0;
}

练习:求水仙花数。 一个三位数。各个位上的数字的立方和等于本数字。 234 861

100 -- 999

int num  = 100;

个位数: int a = num % 10;   		a*a*a;

十位数: int b = num / 10 % 10; 

百位数: int c = num / 100;
    

示例

#include <stdio.h>

int main(void)
{
	int num = 100;
	int a, b, c;
	do
	{
		a = num % 10; //个位;
		b = num / 10 % 10;//十位;
		c = num / 100;//百位;
		if (a * a * a + b * b * b + c * c * c ==num) 
		{
			printf("水仙花数是%d\n", num);
		}
		num++;
	} while (num < 1000);

	return 0;
}