iOS学习之C语言基础学习day-03

数据类型转换:

1.当赋值符号两边的数据类型不同的时候,数据类型转换是自动的,不需要程序员插手

当给 int 类型的变量赋值的时候:

1).如果我们赋值的数据超出 int 的范围,这个时候 c 会将数据为 1 个随机的 int 数据.

int num =2200000000;

printf("num = %d\n",num);//num = -2094967296(后面学了进制就知道这个数怎么来的)

2).如果我们赋值的数据超出 int 的范围太多,这个时候自动类型转换就无能为力,编译器直接报错.

编译器直接报错

3).如果我们赋值的数据是一个小数,这个时候 c 会直接截取整数部分.

当给 float 类型的变量赋值的时候:

如果我们用一个double类型的小数给float变量赋值,会把double类型的浮点数转换成float类型小数,不会报错,精度丢失

2).如果我们用一个 int类型数给float变量赋值,那么就将这个整数转换成float类型小数,所以在赋值的时候加一个 .0f!!!

当给 double 类型的变量赋值的时候:

1).如果我们用一个float类型的小数给double变量赋值,会把float类型的浮点数转换成double类型小数,不会报错,精度提高

2).如果我们用一个 int类型数给double变量赋值,那么就将这个整数转换成double类型小数,所以在赋值的时候加一个 .0!!!

当给 char 类型的变量赋值的时候:

1).ASCII码:

只要记住这3个,其他的,推出来

'A' 65

'a' 97

'0' 48

2).如果我们用一个 int类型数给 char变量赋值,其实在赋值的时候是以这个整数为 ASCII 码所对应的字符数据.

scanf函数的简单使用:

a:在格式控制符中用占位符来要求用户输入 1 个指定类型的数据.

b:在后面写上要将用户输入的数据到 1 个变量的地址,用 & 就可以取到变量的地址.

c:如果程序没有输出信息,下面的控制台输出区域不会自动弹出来的.

注意:scanf函数是一个阻塞式函数,用户不输入,就不会往下执行。

scanf 函数

scanf函数接收各个类型的数据:

1).使用 scanf 函数接收其他类型的数据,想要让用户输入什么类型的数据,是根据格式占位符来决定的

%d用户输入 int的数据scanf("%d", &变量名);

%f用户输入 float的数据scanf("%f", &变量名);

%lf用户输入 double的数据scanf("%lf", &变量名);

%c用户输入 char的数据scanf("%c", &变量名);

2).scanf函数使用的步骤:


步骤

3).使用scanf函数需要注意的细节

1.定义变量的时候不要再用a,b,c

2.注释要写

3.scanf函数习惯性的加了\n,这个一定一定要注意,scanf函数双引号里不能加\n

\n可以过滤多个空白字符(换行符,制表符和空格),直到遇到非空白符的时候才终止输入。但那个非空白符并没有读到scanf里

4.不要忘记加&  --->奔溃

5.scanf里面的格式控制符,一定要和你要输入的变量的类型一致,否则会出问题

4).使用scanf函数一次接收输入多个数据

1.没有自定义分隔符(分隔符默认是空格/回车/tab)

1).此时如果要求输入的是整数或者浮点数,输入过程中的回车/空格/tab,都会被忽略.

int num_int1 =0;

float num_f =0.0f;

int num_int2 =0;

printf("输入前%d-%f-%d\n",num_int1,num_f,num_int2);

scanf("%d%f%d",&num_int1,&num_f,&num_int2);

printf("输入后%d-%f-%d\n",num_int1,num_f,num_int2);


输入前0-0.000000-0

1 12.34 111

输入后1-12.340000-111

Program ended with exit code: 0


2).如果有字符,如果在输入字符之前有多余的操作(空格/回车/tab),数据的赋值就会有问题.

int num_int =0;

char num_char ='a';

int num_int2 =0;

printf("输入前%d-%c-%d\n",num_int,num_char,num_int2);

scanf("%d%c%d",&num_int,&num_char,&num_int2);

printf("输入后%d-%c-%d\n",num_int,num_char,num_int2);


输入前0-a-0

12 b 13     //12 空格 b 空格 13 回车

输入后12- -0     //12-空格-0

Program ended with exit code: 0


2.自定义分隔符

1).一旦指定,就要严格按照自定义的分隔符进行分割,绝对没有问题的

int num_int1 =0;

char num_char ='a';

int num_int2 =0;

printf("输入前%d-%c-%d\n",num_int1,num_char,num_int2);

scanf("%d--%c--%d",&num_int1,&num_char,&num_int2);

printf("输入后%d-%c-%d\n",num_int1,num_char,num_int2);

这里的自定义分隔符是"--"


输入前0-a-0     //没有按照自定义的分隔符 "--" 进行分割,出问题了

12-b-13     //12 - b - 13 回车

输入后12-a-0

Program ended with exit code: 0



输入前0-a-0     //按照自定义的分隔符 "--" 进行分割,没有出问题

12--b--13     //12 -- b -- 13 回车

输入后12-b-13

Program ended with exit code: 0


3.scanf函数的缓冲区

1.当控制台停下来等待你输入,说明缓冲区是空的

2.你输入的所有数据都会存储到缓冲区,然后程序从缓冲区拿数据向变量赋值

3.只要缓冲区有数据,程序再遇到scanf语句,就不会在控制台等待你输入,

4.程序从缓冲区拿数据,如果是给浮点数或者整数赋值,忽略空格/tab/回车,"给字符赋值,不忽略回车

例子1:输入1空格2空格3回车

int num1=0,num2=0,num3=0;

printf("输入前%d-%d-%d\n",num1,num2,num3);

printf("请输入:");     //输入1空格2空格3回车

scanf("%d%d",&num1,&num2);

printf("----------------\n");

scanf("%d",&num3);

printf("输入后%d-%d-%d\n",num1,num2,num3);

结果是:


输入前0-0-0

请输入:1 2 3

----------------

输入后1-2-3

Program ended with exit code: 0


从上面可以看出当从缓冲区中拿数据的时候,如果要拿的数据是整型或者实型,如果拿到的是空格 回车 Tab键,就会自动忽略,继续往下拿.

例子2:

int num1 =1;

char num_c ='a';

printf("输入前:%d-%c\n",num1,num_c);

printf("请输入:");

scanf("%d",&num1);

scanf("%c",&num_c);

printf("输入后:%d-%c\n",num1,num_c);

结果是:



例子2

从上面可以看出当从缓冲区中拿数据的时候,如果要拿的数据是字符型不会自忽略任何数据.

***所以我们可以用清空缓冲区的方式来解决上面的问题***

int num1 =1;

char num_c ='a';

printf("输入前:%d-%c\n",num1,num_c);

printf("请输入:");

scanf("%d",&num1);

rewind(stdin);//清空缓冲区

scanf("%c",&num_c);

printf("输入后:%d-%c\n",num1,num_c);

return0;

结果是:


输入前:1-a

请输入:10     //输入10回车 b回车

b

输入后:10-b

Program ended with exit code: 0


务必记住:凡是需要输入字符,请你单独写一句scanf函数,并且前面加上rewind(stdin)

交换两个变量的值:

1.第一种方式:

int num1 =5;

int num2 =10;

printf("交换前:num1 = %d  num2 = %d\n", num1, num2);

int tempNum = num1;//tempNum = 5 num1 = 5

num1 = num2;//num1 = 10 num2 = 10

num2 = tempNum;//num2 = 5 tempNum = 5

printf("交换后:num1 = %d  num2 = %d\n", num1, num2);


交换前:num1 = 5  num2 = 10

交换后:num1 = 10  num2 = 5

Program ended with exit code: 0


2.第二种方式:两数相加再相减

int num1 =5;//初始值

int num2 =10;//初始值

printf("交换前:num1 = %d   num2 = %d\n", num1, num2);

num1 = num1 + num2;// num1 = num1的初始值+ num2的初始值

num2 = num1 - num2;//num2 = num1的初始值+ num2的初始值- num2的初始值num2 =  num1的初始值

num1 = num1 - num2;// num1 = num1的初始值+ num2的初始值- num1的初始值num1 = num2的初始值

printf("交换后:num1 = %d   num2 = %d\n", num1, num2);


交换前:num1 = 5   num2 = 10

交换后:num1 = 10   num2 = 5

Program ended with exit code: 0


算术运算符和算术表达式:

算术运算符:+ - * / %

算术表达式:由算术运算符连接起来的式子

1.算数表达式的值有类型.算数表达式最终结果类型,取决于精度最高的那个数.

double>float>int

2.当参与运算的数据类型一致,算数运算表达式的结果的类型就是参与运算的数据的类型

分析下面代码段:

//先声明变量,再计算表达式的结果,最后将表达式的结果赋值给变量

int result =1/3;//0.3333

printf("%d\n",result);//0

doubleresult =1/3;//0.3333333    0   --- > 0.000000

printf("%lf\n",result);//0.000000

上面的算数表达式都是 int 类型的,所以这个表达式的结果是 0 ,不是 0.3333

如何获取两个整数的真实的商?

//思路:定义操作数为double类型、或者操作数*1.0

double result = (double)1/3;

printf("%lf\n",result);//0.333333

3.%求模运算

1>浮点数不能参与求模运算,没有意义

2> m % n求余的结果一定是0~ n-1之间

m%n求余

(1)n 等于0无意义

(2)m 等于0结果为0

(3)m>n 正常求余如:8%3=2

(4)m<n 结果是m如:2%4=21%4=13%8=3

算术运算符的优先级和char数据参与算术运算:

1.* / %优先级相等并且高于+ - (+ -优先级相同),如果同级别,从左到右运算,如果有小括弧,就先算小括弧里的表达式.

2.char变量/常量和整数一起运算,直接拿ASCII码进行运算

int sum ='a'+3;// 'a' -->97 + 3 ---> 100

printf("%d\n", sum);//100

char char_b ='b';

sum =3+ char_b;// 'b' -->98 + 3 --->101

printf("%d\n", sum);//101

3.如何把小写的字母转化为大写

'A'--->65                  'a'--->97

'B'--->66                  'b'--->98

小写-->大写-32         大写-->小写+32

复合赋值运算符:

1.常见的复合赋值运算

int num =10;

+=比如: num +=10; --->等价于num = num +10;

-=比如: num -=10; --->等价于num = num -10;

*=比如: num *=10; --->等价于num = num *10;

/=比如: num /=10; --->等价于num = num /10;

%=比如: num %=10; --->等价于num = num %10;

2.如果以后想在一个变量自身的基础上改变当前的值,就可以使用复合赋值运算符

自增与自减运算:

1)前缀表达式:++x, --x;其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即“先变后用”,也就是变量的值先变,再用变量的值参与运算。

2)后缀表达式:x++, x--;先用x的当前值作为表达式的值,再进行自增自减1运算。即“先用后变”,也就是先用变量的值参与运算,变量的值再进行自增自减变化。

注意:不管“++”在前还是在后,最后变量的值都会+1

a++  -->后自增表达式-->整个a++的表达式的值是a   --> a变量的值是a+1;

++a  -->前自增表达式-->整个++a的表达式的值是a+1--> a变量的值是a+1;

a--  --> a--表达式的值是a   -->  a变量的值a-1

--a  --> --a表达式的值是a-1-->  a变量的值a-1

逗号表达式:

1.知道逗号表达式的结构(AAA,BBB,CCC)

2.执行过程从左向右执行

3.整个逗号表达式的结果是最后一个式子也就是CCC的值.

4.逗号表达式的目的,只要前面的表达式执行,关心最后一个表达式的结果是多少,因为我们前面的表达式一旦执行就会影响最后一个表达式的结果

比较运算符和比较表达式:

1.比较运算符:

>      大于

<      小于

>=     大于等于

<=     小于等于

==     等于

!=     不等于

2.比较运算符的作用:比较大小的

3.比较表达式:由比较运算符连接起来的式子

4.比较表达式的结果:

比较表达式用来比较若干数据之间的大小关系,

比较表达式的结果是0或者 非0,0表示不成立非0表示成立

5.优先级:

> < >= <=的优先级相等

== !=的优先级相等

> < >= <=的优先级高于== !=的优先级

比较运算表达式的场景:

1.比较运算符的两边可以是常量或者是变量

int result =1>2;// 0//常量

int num=1;//变量

int result2 = num <2;// 1

2.比较运算符的两边可以分别是表达式

int num =10;

int result =11- num < num *2;// 1<20 --->1

算术运算符的优先级比关系运算符的优先级高,一个式子里面既有比较运算符又有算数运算符就先算数运算符,再算比较运算符.

3.char类型的变量或者常量也可以参与比较运算符,比较的是相应的ASCII码

逻辑运算符:

&&逻辑与并且

||逻辑或或者

!逻辑非取反

1.计算机的世界中,"非0就是真,0就是假

2.输入一个年份,判断是不是闰年

(年份%400==0) || (年份%4==0)&&(年份%100!=0)

逻辑与运算符

A && B

1.&&逻辑与运算符运算规则

A和B都是真结果才是真,A和B有一个是假,结果就是假)("同真则真,一假则假")

2.断路问题

A是假,B将不会再进行判断,整个式子是假的

逻辑或运算符

A || B

1.||逻辑与运算符运算规则

A和B只要有一个是真结果就是真,A和B都是假,结果才是假"一真则真,同假为假"

2.断路问题

A是真,B将不会再进行判断,整个式子是真

!逻辑非运算规则

真变假 假变真 非零变0 0变1

逻辑运算符的优先级和结合性

1.什么是优先级

当一个表达式中,有各种各样的不同类型的运算符的时候,此时应该先计算哪一个运算符?

解决这个问题的方案就是优先级

2.什么是结合性

当一个表达式中存在运算符的优先级相等的时候,此时应该从左向右运算还是从右向左运算

解决这个问题的方案就是结合性


运算符的优先级与结合方向

断路问题

1.当自增自减运算和逻辑运算组合时,编译器编译代码的时候,放弃优先级,从左向右扫描,最后去判断自增自减要不要去执行

2.当逻辑&&和逻辑||组合运算时,仍然是放弃优先级,从左向右扫描,如果有断路,后面的就不执行,如果没有断路,那么就按照正常的优先级来计算

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容