c语言基础2

一、输入输出函数

1 输出函数

可以取man手册查看printf函数的原型

man 3 printf

c语言基础2_第1张图片

2 输入函数

&a; ----->取变量的地址

c语言基础2_第2张图片

scanf获取数据的特点

scanf在获取多个数据时,以空格、tab键和回车作为数据分隔的标志

回车在每一个格式符都获取到数据后,回车作为scanf结束的标志,如果有格式符没有获取到数据,回车作为数据分隔的标志。

#include 
int main(int argc, const char *argv[])
{
    int a,b,c,d;   //定义变量a不初始化
    //终端获取变量的值
    //scanf("%d,%d,%d,%d",&a,&b,&c,&d);
    //scanf("%d%d%d%d\n",&a,&b,&c,&d);
    scanf("%d%d%d%d",&a,&b,&c,&d);
    printf("a=%d\n",a);
    printf("b=%d\n",b);
    printf("c=%d\n",c);
    printf("d=%d\n",d);
    return 0;
}

scanf吸收垃圾字符的问题

在使用scanf获取字符类型数据时,存在需要吸收垃圾字符的问题

因为空格、tab键和回车都是一个字符,会被%c获取到

i)使用空格吸收垃圾字符

利用scanf严格控制格式的特点,在双引号内添加空格,来达到吸收垃圾字符的效果。

#include 
int main(int argc, const char *argv[])
{
    char c1,c2,c3,c4;
    //终端获取字符类型数据的值
    scanf(" %c %c %c %c",&c1,&c2,&c3,&c4);
 //每一个格式符前面的空格,都可以吸收空格、tab键和回车,如果没有空格、tab键和回车,就正常按照程序员的输入获取数据
    //输出数据的值
    printf("%c\n",c1);
    printf("%c\n",c2);
    printf("%c\n",c3);
    printf("%c\n",c4);
    return 0;
}

ii)使用抑制字符吸收垃圾字符

抑制字符是%*c

抑制字符必须吸收一个字符无论是否是垃圾字符

#include 
int main(int argc, const char *argv[])
{
    char c1,c2,c3,c4;
    //终端获取字符类型数据的值
    //scanf(" %c %c %c %c",&c1,&c2,&c3,&c4);
    scanf("%c%*c%c%*c%c%*c%c",&c1,&c2,&c3,&c4);
    //输出数据的值
    printf("%c\n",c1);
    printf("%c\n",c2);
    printf("%c\n",c3);
    printf("%c\n",c4);
    return 0;
}

iii)使用getchar吸收垃圾字符

getchar()是一个从终端获取字符型数据的函数

#include 
int main(int argc, const char *argv[])
{
    char c1,c2,c3,c4;
    //终端获取字符类型数据的值
    scanf("%c",&c1);
    getchar();  //获取两个字符数据间的垃圾字符
    scanf("%c",&c2);
    getchar();
    scanf("%c",&c3);
    getchar();
    scanf("%c",&c4);

    //输出数据的值
    printf("%c\n",c1);
    printf("%c\n",c2);
    printf("%c\n",c3);
    printf("%c\n",c4);
    return 0;
}

3 字符类型的输出函数 

putchar(变量名);
函数原型:
int putchar(int c);
功能:输出单个字符
参数:字符的ASCII码值或字符本身
返回值:int类型

#include 
int main(int argc, const char *argv[])
{
    char c1 = 'h';
    putchar(c1);  //输出h字符
    putchar(10);  //10是\n的ascii码值,输出换行
 putchar('\n');  //输出字符'\n',就是换行
    return 0;
}

4 字符类型的输入函数 

getchar();
函数原型:
    int getchar(void);  --->getchar函数不需要参数,返回值为从终端获取数据的ASCII码
功能:输入单个字符
eg:从终端输入char c的值,
c = getchar();


#include 
int main(int argc, const char *argv[])
{
    char c1;
 c1 = getchar();
    putchar(c1);  //输出h字符
    putchar(10);  //10是\n的ascii码值,输出换行
    return 0;
}

二、运算符

1 算数运算符

类似于数学中的运算 + - * / %

#include 
int main(int argc, const char *argv[])
{
    printf("%d\n",10/4);
    printf("%f\n",10.0/4);
    printf("%f\n",(float)10/4);  //用强制类型转换将10强转成float
    //printf("%d\n",10.0%4);
    printf("%d\n",10/4);  //2
    return 0;
}

 2 自增自减运算符

++i、i++、--i、i--

++ii+1

++i:获取到的是i自增1

++i:获取到的是i自增1后的值,i本身发生改变

i++:获取到的是i自增前的值,i本身也发生了改变

--i:获取到的是i自减1后的值,i本身发生改变

i--:获取到的是i自减前的值,i本身发生改变

如果运算符在前面就获取运算后的结果,如果运算符在后面就获取运算前的结果。

#include 
int main(int argc, const char *argv[])
{
    int i=9;
    printf("i++=%d\n",i++); //9
    printf("i=%d\n",i); //10
    printf("++i=%d\n",++i); //11
    printf("i=%d\n",i); //11
    int j = 10;
    printf("%d\n",--j);  //9,--运算符在前面获取运算后的结果
    printf("j=%d\n",j);
  //9
    return 0;
}

3 赋值运算符 

 a=b; --->将b的值赋值给a

a+=2; --->a=a+2;

a-=2; --->a=a-2;

a*=2; --->a=a*2;

a/=2; --->a=a/2;

a%=2; --->a=a%2;

#include 
int main(int argc, const char *argv[])
{
    int i=9;
    /********************自增自减运算符***********************/
    printf("i++=%d\n",i++); //9
    printf("i=%d\n",i); //10
    printf("++i=%d\n",++i); //11
    printf("i=%d\n",i); //11
    int j = 10;
    printf("%d\n",--j);
    printf("j=%d\n",j);
    /*******************赋值运算符****************************/
    printf("j-=2:%d\n",j-=2);
    printf("i*=2:%d\n",i*=2);
    int ret = (j*=2);
    printf("ret=%d\n",ret);
    return 0;
}

4 关系运算符

关系运算的结果是一个固定的值,真值/假值,1/0

计算机中非0为真,0为假

0.1(真值)

5 条件运算符

是C语言中的唯一一个三目运算符

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

逻辑: 如果表达式1成立,执行表达式2,否则执行表达式3

#include 
int main(int argc, const char *argv[])
{
    int i=9,j=4;
    printf("%d\n",ij:j);    //1 ,--i是7 真值表达式成立,执行i>j
    printf("i=%d\n",i);  //7
    printf("j=%d\n",j);  //5
    return 0;
}

6 逻辑运算符

逻辑运算的结果是真值/假值, 1/0

操作

逻辑

&&(逻辑与)

表达式1&&表达式2

两个表达式同时为真,结果为真

||(逻辑或)

表达式1||表达式2

只要有一个表达式为真,结果为真

!(逻辑非)

!表达式

非真即假,非假即真

逻辑运算存在逻辑短路现象:

逻辑与运算时,如果运算符左侧的表达式结果为0,右侧的表达式不会执行

逻辑或运算时,如果运算符左侧的表达式结果为1,右侧的表达式不会执行

7 逗号运算符

格式:

(表达式1,表达式2,表达式3,表达式4,····表达式n)

执行逻辑:

逗号运算符的每一个表达式都会执行,取最右侧表达式的结果

#include 
int main(int argc, const char *argv[])
{
    int i=6,j=7;
    int ret = (i++,j--,i>j?i:j,--i);
    printf("ret=%d\n",ret);  //6
    printf("i=%d\n",i);      //6
    printf("j=%d\n",j);      //6
    return 0;
}

8 sizeof()运算符

sizeof说是C中的一个关键字也可以,sizeof的使用类似于函数调用的格式

格式:

sizeof(数据); --->数据可以是数据类型也可以是变量名也可以是常量

功能:

求()内内容所占的内存大小,以字节为单位

    printf("%ld\n",sizeof(int));
    printf("%ld\n",sizeof('c'));  //计算ascii码值所占的大小,整数默认是int类型,结果是4
    char w = 'c';
    printf("%ld\n",sizeof(w));

9 位运算符

对二进制位进行运算,bit位如果没有特殊说明,默认从最右侧一位开始是第0位

右移n位,表示除2^n

左移n位,表示乘2^n

操作

逻辑

>>(右移运算符)

a>>n

a向右移动n个bit位,高位补符号位

a

a向左移动n个bit位,低位补符号位

^(异或)

a^b

a和b按位异或

同0异1

~(取反)

~a

每一个bit位按位取反

&(按位与)

a&b

两个bit位有一个0结果为0

两个都为1结果为1

|(按位或)

a|b

两个bit位只要有一个为1结果为1

两个都是0结果为0

#include 
int main(int argc, const char *argv[])
{
    printf("%d\n",7>>2);
    //0111 >> 2 = 0001 抹掉最右侧两位,高位补符号位
    printf("%d\n",1<<2);
    //0001 << 2 = 0100 抹去最左侧的高位,低位补符号位
    printf("%d\n",1^3);  //同0异1
    //0001
    //0011
    //    同0异1
    //0010 = 2    
    printf("%d\n",1&3);
    //0001
    //0011
    //   有一个0就是0 
    //0001   
    return 0;
}

位运算进场用来执行对某一位置0和置1的操作

eg:已知一个数a,想要给a的第13个bit置0,给a的第5个bit置1,要求操作不能修改其他bit位的值

a&=~(0x1<<13)

a|=(0x1

按位与运算可以实现对bit位置0的操作

按位或运算可以实现对bit位置1的操作

10 运算符优先级

单算移关与,异或逻条赋

如果不想记优先级顺序,加括号

后缀自增和后缀自减的优先级更高

c语言基础2_第3张图片

三、C代码结构 

1、顺序结构:代码从上到下顺序执行

2、分支结构

3、循环结构

四、if分支语句

1 if单分支语句

if(条件表达式)
{                         --->建议大家在写if时,两个{}都单独占一行
    条件成立执行的代码块;
}

if语句的{},在代码块中只有一条语句的情况下可以不写。
if(1)
{
    printf("test\n");
}  ------>可以不写的情况
if(1)
{
    printf("test\n");
    printf("1\n");
}   ------>不能不写{},如果不写{},只有test的输出是和if有关的,1无论条件是否成立都会输出

if(0)
    printf("test\n");
    printf("1\n");  ---->会输出和条件是否成立无关

2 if双分支语句

满足条件执行一段代码,不满足条件执行另一段代码

if(条件)
{
    满足条件执行的语句块;
}
else
{
    不满足条件执行的语句块;
}

3 if多分支语句 

if(条件1)
{
    满足条件1执行的语句块;
}
else if(条件2)
{
    不满足条件1,但是满足条件2执行的语句块;
}
else if(条件3)
{
    不满足条件1,也不满足条件2但是满足条件3执行的语句块;
}

五、练习 

1 已知变量a=70,给a的第6个bit位置0,给a的第4个bit位置1,给a的第5个bit位取反(异或)。

#include 
int main(int argc, const char *argv[])
{
	int a=70;
	a=(a&~(0x1<<6));
	printf("a=%d\n",a);  // a=22
	a=70;
	a=(a|(0x1<<4));
	printf("a=%d\n",a);  // a=86
	a=70;
	a=(a^(0x1<<5));
	printf("a=%d\n",a);  // a=102
	return 0;
}
ubuntu@

2 终端输入学生成绩,判断成绩等级[100,90]A,(90,80]B,(80,70]C,(70,60]D,(60,0]不及格,需要对成绩合理性进行判断,如果成绩大于100或者小于0成绩不合理。 

#include 
int main(int argc, const char *argv[])
{
	int a;
	scanf("%d",&a);
	if(100>=a&&a>=90)
	{
		printf("成绩等级为A\n");
	
	}
	else if(90>a&&a>=80)
	{
		printf("成绩等级为B\n");
 
	}
	else if(80>a&&a>=70)
	{
		printf("成绩等级为C\n");
 
	}
	else if(70>a&&a>=60)
	{
		printf("成绩等级为D\n");
 
	}
	else if(60>a&&a>=0)
	{
		printf("成绩不合格\n");
 
	}
	else if(a>100||a<0)
	{
		printf("成绩不合理\n");
	}
	return 0;
}

c语言基础2_第4张图片 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(c语言,开发语言)