黑马程序员——C语言基础语法--scanf函数、基本运算、流程控制

时间:2020-12-24 00:22:35

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

scanf函数

调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量。

  1. 函数格式
int age;
scanf("%d", &age);

1> scanf函数只接受变量的地址,所以scanf的第2个参数传递的不是age变量,而是age变量的地址&age,&是C语言中的一个地址运算符,可以用来获取变量的地址。
2> scanf函数是一个阻塞式函数,会一直等待用户输入。

  1. 使用注意

1> 输出字符

char myc;
scanf("%c", &myc);
printf("输入的字符是%c\n", myc);

2>输出多个值
一次性输入多个数值时需要以某些符号隔开。

int num1, num2;
scanf("%d#%d", &num1, &num2);
printf("num1=%d, num2=%d\n", num1, num2);

3>分隔符
如果scanf参数中以空格隔开,实际输入可以以空格、tab、回车作为分隔符。

int num1, num2;
scanf("%d %d", &num1, &num2);
printf("num1=%d, num2=%d\n", num1, num2);

4>scanf函数中不能写\n

int a;
scanf("%d\n", &a);
printf("a的值是%d\n", a);

这是错误写法,无法正常编译。

基本运算

C语言一共有34种运算符,包括了常见的加减乘除运算

一、 算术运算
基本的算术运算包括:
加法运算+
减法运算-
乘法运算*
除法运算/
取余运算%
1> 取余即获取两个整数相除之后的余数
2> %两侧只能是整数
3> 正负性取决于%左侧的数值
4> 用取余可以将值固定在一个范围内

在算术运算的时候需要注意几种类型转换:
1>自动类型转换(double->int)

int a = 10.8;

2>强制类型转换(double->int)

int b = (int) 10.5;

3>自动类型提升(int->double)

double c = 10.6 + 6;

二、 赋值运算

 int a = 10 + 5;

复合赋值运算符

a += 5; // a = a + 5;
a *= 5; // a = a * 5;
a += 5 + 6 + 4; // a = a + (5 + 6 + 4);

三、自增自减

自增运算符:如a++,++a,都等价于a = a+1。
自减运算符:如a–,–a,都等价于a = a-1。
a++:变量a先加1,然后使用;
++a:先使用变量a,再加1 。
自减运算符区别相同。

四、sizeof

int size = sizeof(10);//sizeof( 变量\常量 )
int size = sizeof 10.9;//sizeof 变量\常量
int a = 10;
int size = sizeof(a);
int size = sizeof a;//sizeof( 数据类型 )
int size = sizeof(char);
int size = sizeof char;//sizeof 数据类型 是错误的

五、关系运算符

在C语言中判断关系就是判断“真”“假”,也就是0和1。
1> 关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者:2==3>1
2> 关系运算符的结合方向为“从左往右”: 4>3>2
3> 关系运算符的优先级小于算术运算符:3+4>8-2

算术运算符的优先级大于关系运算符。

六、逻辑运算

1.&& 逻辑与
“条件A && 条件B”
如果条件A成立,接着再判断条件B是否成立:如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”。
如果条件A不成立,就不会再去判断条件B是否成立:因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果肯定是0,也就是“假”。

2.|| 逻辑或
“条件A || 条件B”
如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”。
如果条件A不成立,接着再判断条件B是否成立:如果条件B成立,“条件A || 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”。

3.! 逻辑非
“! 条件A”

C语言规定:任何非0值都为“真”,只有0才为“假”。

七、三目运算符

条件?数值1:数值2
若条件成立返回数值1,不成立返回数值2。
利用三目运算符可以比较简洁的进行判断,如下判断a,b,c中的最大值

#include <stdio.h>

int main()
{
printf("请输入三个整数并以空格隔开:\n");

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

int temp = a>b ? a:b;
int max = temp>c ? max1:c;

printf("最大值为%d\n",max);

return 0;
}

在进行基本运算时一定要注意各符号的优先级,如下图所示
黑马程序员——C语言基础语法--scanf函数、基本运算、流程控制

流程控制

C语言的结构分为:顺序结构,选择结构,循环结构。
顺序结构:默认的流程结构。按照书写顺序执行每一条语句。
选择结构:对给定的条件进行判断,再根据判断结果来决定执行哪一段代码。
循环结构:在给定条件成立的情况下,反复执行某一段代码。
如下图所示:
黑马程序员——C语言基础语法--scanf函数、基本运算、流程控制

顺序结构比较简单,按照逻辑关系编写代码即可。

一、 选择结构-if

if语句有四种结构:
1>
if(条件)
{
语句1;
语句2;
……
}
2>
if(条件1)
{
语句1;
语句2;
……
}
else
{

}
3>
if(条件1)
{
语句1;
语句2;
……
}
else if(条件2)
{

}
else if(条件3)
{

}
else
{

}
4>
if (条件)
语句1;

在if语句中比较大小时,常量值放左边,变量值放右边。同时如果在if后面的语句中定义新的变量,必须用大括号{},不然作用域是不明确的。如下:

if (10 > 6)
int a = 5;

二、 选择结构-switch

switch结构比较单一,只有一种:
switch (数值)
{
case 数值1:
语句1;
break;

case 数值2:
语句2;
break;

default :
语句3;
break;

}
使用switch语句时需要注意break的重要性。break代表着退出整个switch语句,如果case后面没有break,就会执行后面所有case中的语句,直到遇到break为止。如下:

#include <stdio.h>

int main()
{
int a = 10;
int b = 10;

switch (a)
{
case 10:
printf("A\n");
b++;
case 5:
printf("B\n");
b++;
case 0:
printf("C\n");
b++;
break;
default:
printf("D\n");
break;
}

printf("b的值是%d\n", b);

return 0;
}

输出结果为:
黑马程序员——C语言基础语法--scanf函数、基本运算、流程控制
同if结构相同,如果要在case后面定义新的变量,必须用大括号{}包住。

有些情况下,if语句和switch语句是可以互换的。switch能完成的功能,if语句都能完成,但是if语句能完成的功能,switch并不一定能完成,比如下面的例子:

int a = 10;
if (a>100)
{

}

三、 循环结构-while

while (条件)
{
循环体
}
如果一开始条件就不成立,永远不会执行循环体;如果条件成立,就会执行一次循环体,执行完毕,再次判断条件是否成立,循环至条件成立为止。
while结构中也有break和continue:
break直接结束整个while循环;
continue结束当前的循环体,进入下一次循环体的执行。
最简单的死循环:while(1);

四、循环结构-do while

do {

} while(条件);
while和do-while的区别:
1.很多情况下,while和do while可以互换;
2.while特点:如果一开始的条件不成立,永远不会执行循环体;
do while特点:不管一开始的条件是否成立,至少会执行一次循环体;
3.最好使用while。

五、循环结构-for

for (语句1; 条件; 语句2)
{
循环体
}
*语句1:初始化语句
*语句2:增量语句(执行完循环体后再执行的语句)

for循环原理:
for一开始就会执行一次语句1(整个for循环只会执行一次),判断条件是否成立,如果条件成立,就会执行一次循环体,然后就会执行语句2,再次判断条件是否成立。

for循环同样需要注意作用域的问题,如果要在循环体中定义新的变量,必须用大括号{}包住。如下:

for (int i=0; i<5; i++)
int a = 10;

利用for循环实现最简单的死循环:for(;;);。

for循环嵌套可以很好的实现两个变量同时变化,下面是输出九九乘法表的代码,可以体会一下。

/*
输出九九乘法表
*/

#include <stdio.h>

int main()
{
//确定行数
for(int i = 1;i <= 9;i++)
{
//确定列数
for(int j = 1;j <= i;j++)
{
int ride = i*j;

printf("%d×%d=%d ", i, j,ride);
}

printf("\n");
}
return 0;
}

结果如下
黑马程序员——C语言基础语法--scanf函数、基本运算、流程控制

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-