学C 感悟最深的是为何要如此去规定,为何要如此去写,为何要如此去用。
( # include <>或者是include“” )include 是包含的意思,包含哪个库文件。如果将C语言比作军队,库应该为某一支特殊的军队,专门从事某件事物,比如工程兵,遇山开路,遇水搭桥。C语言中如果需要输入输出( printf(),scanf() ),就要使用(#include <stdio.h> )头文件。不然程序就不支持。军队如果没有工程兵,那么遇到工程兵做的事他就只能征调民夫或者军队自己干,这样效率当然比不上专门的工程兵了。而C语言中也是一样,自己不使用(#include <stdio.h> )头文件也可以啊,自己写啊,但是效率低下。
( int main() ) 是主函数入口,程序从这开始,从这结束。比如军队需要某一支部队做主力作战部队,开头猛打,陷阵摧锋,最后一击,定局取胜。C/C++语言为何如此规定了,如果不这样规定的话,开头怎么写,有些人就会丈二和尚摸不着头脑,不会下手;而且程序的思维逻辑性就不好理清。并且一个约定俗成的规矩是好事,军队需要军法十七禁律五十四斩一样。如果我们不这样写的话,程序就不会支持,编译不会通过。在军队中,犯军法,后果很严重,犯禁律会被砍头枪毙一样,人死了,怎么玩,咱又不是刑天那么牛。
(int a = 0 ; ) 程序是先定义声明后使用,不然程序不支持,为何?设计的时候这样规定的。如果不定义的话,谁知道它是谁啊。当然我们可以在定义的时候初始化,也就是赋值。做个比喻,就是军队之中有多少支部队或者说是编制。在古代一般是十人一什,五人为伍,你是属于哪个哪个伍的,或者是哪个什的(有可能只有什哦,不要钻牛角尖)。定义就是将你编入哪一个伍或者什,用你去打仗的时候调用某某伍某某什就可以了吧,赋值也可以这样说你这个伍中或者什中有多少人。(int a = 0 ; ) ,为什么要说是将a赋值为 0 ,而不是等于 0 了?打个比方,如果某一支军队实际有10000人,打仗了, 死了4000人。那么他的人数是不是变为6000。那这个时候该怎么改?等于,好,那就等于,某支军队人数等于6000人。如果是6000人的话,继续战斗;5000人撤退。那这怎么玩了?某支军队人数( a )等于6000人,还是战斗( if(a=6000) ),等于5000人撤退( if( a = 5000 ) ),这不对啊,他到底是该撤退了,还是该继续战斗了。所以 == 就出来了。
(int short long double float 等等),各个数据类型各有用处,也各有各的局限,使用时需要注意。编译的时候不超过界限还好,超过出大事。打仗打胜了还好,打败了,呵呵。为何要如此规定了?电脑的内存空间是有限的,虽然现在内存大了很多,但是该知道的还是要知道。军队中使用某一支部队,需要做一些小事,不惊动敌人,就要精简部队,挑选精锐吧。做声扬之事的时候,筛进去一些普通部队可以壮大声势,虽然降低战斗力。好比C语言中多使用内存造成可用内存减少的后果(虽然有点小)。
( for (int count = 1; count <= 100; count++) ) 这是一个 for 循环,可以算出从 1 加到 100 。如果是 int 100 个变量,然后再将这100 个变量加起来,这样是不是很傻?所以设计中有 for 循环。这个语句先是在 for 循环里面定义一个 count 的局部变量,当(count <= 100),执行for循环里面的语句,执行之后(count++;)。然后再判断count是否小于等于 100 ,是再次(count++;)。这是循环,当条件(count <= 100;)不成立的时候,跳出for 循环。用军队打仗比喻的话,打不破这个缺口,我就一次一次投入多少多少兵力,直到将自己填入这个绞肉机,这是不成功便成仁。这个是不是瞬间感觉不好了。嗯,我也这样认为。
现在小孩子一般不听话,大人一般就是竹笋炒肉。打个比喻哦,别说虐待小朋友。
( if (小孩子不听话 == true)
{
竹笋炒肉();
} ) if 语句只判断一次,也就说只有起到一次的教育效果。如果他还是不听话了,那么又要竹笋炒肉。但是 if 不行。当然还有一种比喻,这是突击检查,检查,嗯嗯,你懂得。军队打仗的话,就是打瀛洲,你不听话,上蹿下跳,打的就是你。但是,你还叫嚣,怎么办?那么就要使用while 了。
( while (小孩子不听话 == true)
{
竹笋炒肉();
控制循环语句;
} )这个while 语句是一直执行,不听话就一直竹笋炒肉,等小孩子听话的时候就停止竹笋炒肉。另外一种比喻是一种守着你,专门盯着你。打瀛洲就是一直打到你听话,才不打你了。
( do{
竹笋炒肉();
控制循环语句;
}while(小孩子不听话 == true);) do …… while 循环是先竹笋炒肉,再来看看小孩子是否听不听话。这种办法不好不可取,不管怎样,至少要竹笋炒肉一次,(这放在谁身上都不好受吧)不听话,再进行一次竹笋炒肉。这个最是暴力,建议不要选择这种。 这个对付瀛洲最爽了最YY了,不管咋样,先揍一顿再说。但是需要针对某一个不听话的,怎么办? C 语言设计出另外一个东东,switch 就派上了用场。
( switch (几号不听话)
{
case 1:
打几号;
break;
case 2:
……
} )使用这个需要注意使用 break 语句结束,不然单挑变成1 挑 N ,开无双,最有可能的是群殴。军队打仗的话,就是哪个东西不听话,就打哪个东西。
使用switch 语句还有一个技巧,比如是一个骰子,点数的大小,123为小,456为大。
( switch (骰子大小)
{
case 1:
case 2:
case 3:
printf(“小\n”);
break;
case 4:
case 5:
case 6:
printf(“大\n”);
break;
default :
break;
} ) 这是使用一 break 的一个技巧,骰子大小数是 123,他会执行( case 1: case 2: case 3: )语句之后, 然后再执行 printf() 语句,最后( break ;),跳出switch 。至于( default : ) 是骰子大小不符合各个(case :) 分支语句,跳出switch。这个是以防万一,写switch 语句的时候建议加上 (default :) 分支语句。
但是,如果想保存很多个学生的姓名,年龄,学号,班级,等等信息,是不是有点麻烦。所以C/C++ 语言中有用户自定义数据类型。
C语言中还有自定义数据类型,比如struct 结构体,union联合体(又称共用体) ,enum 枚举类型。
结构体可以包含很多数据类型,有int ,double,指针,数组等等。可以将比做军队之中有很多兵种,有坦克兵,有飞行员,有炮兵,有纯步兵等等。纯步兵很难打得赢吧,赢了也是打得很苦逼。像某些YY小说,长枪阵排队刺杀天下无敌,这是不可能的,古代那么多战争有几场战役纯靠某一个兵种取胜的了?兵种集合起来战斗力就很强大,编写代码的时候需要将一些不同的数据类型集合成一块,那么用起来是不是很轻松,并且思维也很清晰。
结构体虽好,但是占用内存空间有点大,而且某些数据不想用的时候可不可以消失,不占用内存。那么C语言搞出来的联合体就是解决此问题。
同一数据类型的时候,不想多写数据类型怎么办了?C语言设计中枚举就可以办事了,它可以轻而易举的将扑克牌的A——K 赋值为 1 —— 13,而不并写什么int 什么什么滴。
函数:为了实现某一个功能,自己写了很多遍,不想写这么多遍怎么办呢?调用函数!自己写一个函数实现某一个功能,在主函数中然后再去调用它,只一行是不是很简洁。比如军队之中专门建立一支特种部队,用于斩首。当战争爆发时,需要将敌军指挥部端掉,是不是只需要下一个命令,指挥特种部队去干这件事啊。然后当下一次战争时,也只需要一个命令啊(函数调用)。而不必要每一次战争都要自己去建立一支特种部队,战后解散,战前又一次建立吧。
数组:如果在程序中如何存储和处理具有N个整数的数列呢?比如扑克牌的数字大小(大小王不算),用枚举可以解决,很简单,13个,搞定。如果要处理100个1千个1万个呢。用int 变量表达这么多的数,额——,当我没说。数组可以解决吗。它可以连续存储N个数据,用一个下标就可以访问所需要的数据。比如军队打靶,事先分配你是第几号,然后找到你的几号靶子,读出几环,记录数据。下一次想知道你的成绩的话,找到你是第几号就知道你的成绩了吧。
指针:( int cabinet = 100 ; int *p = &cabinet ; ) 去超市买东西的时候,一般事先会把手上的东西( 比如100元RMB )放进储物柜,服务员会给你一个号码牌(int *p = &cabinet ;),柜子cabinet 中放着东西,而指针 p 了就是那个号码牌,可以凭借那个号码牌牌号找到那个柜子,也就是 &cabinet 。找到柜子之后就可以凭借号码牌( *p )取得那 100 元。再换一个理解就是你住的地方是哪条街第几栋第几楼,这是地址,地址里面存放的是你这个人,而我要找你的话就可以凭借你的地址直接找到你了。为什么使用指针了?一般变量就是我从另外一个人知道你的姓名,然后再去找你。但是我知道你住哪,我直接找你就可以啦。指针可以直接操控内存,比一般变量效率更高一点。
汇编语言中随便怎么写都可以,但是一旦将一个东西修改了,就可能造成死机或者其他的严重后果,是不是有问题?如果不准使用的话是不是又一棒子打死啊。所以C/C++中,就出了个指针的东西。
如果调用的函数中需要修改好几个值,而函数返回只有一个值是不是没办法解决?怎么办?凉拌?指针直接使用地址访问内存,修改地址里面的值就可以啰。注意,地址不变,只是地址里面的值变了。比如,小明吃了苹果,香蕉,西瓜,人没有变,只不过是肚子之中的东西变了。
其实,学了C语言之后,换个角度想问题,站在解决问题,开发者的角度想问题,就会知道C语言其实这样规定是何道理。而自己理解起来就不会别扭了(当然,缺心眼的当我没说)。用起来也就顺手了,因为知道它的本质了,干起事来心里就有底了。