学习C/C++语言的感悟(1)——最主要的是解决最初的别扭感

  学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语言其实这样规定是何道理。而自己理解起来就不会别扭了(当然,缺心眼的当我没说)。用起来也就顺手了,因为知道它的本质了,干起事来心里就有底了。

 

时间: 2024-10-09 06:59:52

学习C/C++语言的感悟(1)——最主要的是解决最初的别扭感的相关文章

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----03 指针

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.什么是指针? 用来存放变量地址的变量,就称为"指针变量". 二.指针的定义 一般形式:类名标识符  *指针变量名; int *p; float *q; "*"是一个说明符,用来说明这个变量是个指针变量,是不能省略的,但它不属于变量名的一部分 前面的类型标识符表示指针变量所指向的变量的类型,而且只能指向这种类型的

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----02 printf和scanf函数、基本语句和运算、流程控制、函数、数组、字符串

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.printf函数 1.在使用peintf函数前必须加入#include <stdio.h>,使用它可以向标准输出设备(比如屏幕)输出数据,其中使用格式是 printf(“字符串”) :或者 printf(“字符串”, 格式符参数): 2.常用的格式符及其含义如图所示 3.格式符还可以添加输出宽度 二.scanf函数 1.在使用scanf函

iOS学习笔记---c语言第九天

高级指针 指向结构体变量的指针,称为结构体指针 可以使用->指向内容. %p打印地址 void pLenth(cPoint *p1,cPoint *p2) //求两点间的距离  用的开方函数sqrt()和平方函数pow(,) { float a = sqrt(pow((p1->x-p2->x), 2)+pow((p1->y-p2->y), 2)); printf("两点距离为%.2f\n",a); } //main.m中代码 #import <Fou

ios学习笔记---c语言第二天

一.bool布尔类型    c语言没有bool类型,oc里有bool类型 是一种非真即假的数据类型,布尔类型的变量只有yes和no两个值.yes表示表达式是真,no表示表达式是假. 在c语言中认为非0即为真. 分支语句中常用bool值做判断,判断执行if语句还是else语句. 循环结构中,也常使用bool值做判断,判断是否要执行循环. 注意事项: #define yes 1 #define no 0 计算机在识别时,yes就替换成1,no就替换成0. 二.关系运算符 >   >=   <

黑 马 程 序 员_视频学习总结&lt;c语言&gt;----01 关键字、标识符、注释、 常量、变量

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.关键字 1.关键字就是C语言提供的有特殊含义的符号,有些地方也叫做“保留字”. 2.C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义. auto double int struct break else long switch case enum register typedef char extern return uni

iOS学习笔记---oc语言第三天

继承.初始化方法 一.继承 继承的上层:父类  继承的下层:子类 继承是单向的,不能相互继承 继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和行为 子类能继承父类全部的特征和行为(私有变量也继承过来了,只是不能访问) 面向对象提供了继承语法.能大大简化代码,把公共的方法和实例对象写在父类里.子类只需要写自己独有的实例变量和方法即可 继承既能保证类的完整,又能简化代码 继承特点 oc中只允许单继承 没有父类的类称为根类,oc中得根类是NSObject(祖宗) 继承的内容:所有的实例变量

IOS学习笔记---C语言第四天

1 //?生成2个数组,每个数组都有10个元素,元素取值范围20-40之间,数组对应元素相 加,放到另外?一个数组中 2 #import <Foundation/Foundation.h> 3 4 int main(int argc, const char * argv[]) 5 { 6 7 int num1[10]={0},num2[10]={0},num3[10]={0}; 8 for (int i = 0; i<10; i++) { 9 num1[i]=arc4random()%2

学习C/C++语言:文件的操作

#include<stdio.h> #include<stdlib.h> void main(int argc,char *argv[]) { FILE *in,*out; if(argc!=3) { printf("you forgot to enter a file name\n"); exit(0); } if((in=fopen(argv[1],"r"))==NULL) { printf("cannot open infli

黑 马 程 序 员_视频学习总结&lt;C语言&gt;----06 枚举

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型.比如,你可以用一个枚举类型的变量来表示季节,因为季节只有4种可能的取值:春天.夏天.秋天.冬天.   二.枚举类型的定义 一般形式为:enum 枚举名 {枚举元素1,枚举元素2,……}; en