Fork me on GitHub
C语言关键字、标识符、注释

【零基础学习iOS开发】【02-C语言】03-关键字、标识符、注释

 

上一讲中已经创建了第一个C语言程序,知道了C程序是由函数构成的,这讲继续学习C语言的一些基本语法。C语言属于一门高级语言,其实,所有的高级语言的基本语法组成部分都是一样的,只是表现形式不太一样。就好像亚洲人和非洲人,大家都有人类的结构:2只手、2只脚、1个头,只是他们外表不太一样,比如肤色、脸型。因此,你掌握好了一门高级语言,再去学习其他高级语言,那是相当快的。而且,很多其他高级语言,比如后面要学习的Objective-C,都是基于C语言、从C语言衍生出来的,好好学习C语言吧,绝对不吃亏。

 

 

一、关键字

 

1.什么是关键字

 

关键字就是C语言提供的有特殊含义的符号,有些地方也叫做“保留字”。

 

 

 

2.一共有哪些关键字

 

C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义。

 

复制代码
auto double int struct break else long switch
 
case enum register typedef char extern return union

const float short unsigned continue for signed void
 
default goto sizeof volatile do if while static
复制代码

 

大致浏览一遍即可,不用去百度每个关键字的作用,这些关键字以后会经常用到的,到时候你想不记住都难。

 

 

 

3.如何辨别关键字

 

这些关键字会经常跟其他符号混在一起使用,一个程序里面这么多英文符号,我怎么知道那些是关键字呢?关键字有2大特征:

 

1> 全部都是小写

 

2> 在开发工具或者智能文本编辑工具(比如UltraEdit)中会显示特殊颜色

 

比如下面这段C程序在UltraEdit中呈现的样子

 

 

在这段代码中,只有intreturn是关键字,C语言中的所有关键字在UltraEdit中都会显示蓝色!可以看出,main并不是关键字。至于intreturn究竟有什么特殊含义,这里先不做讨论,后面会详细介绍。

 

 

 

 

二、标识符

 

1.什么是标识符

 

标识符就是在程序中自定义的一些符号和名称。要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的。

 

 

 

2.标识符的作用

 

1> 标识符,从字面上理解就是用来标识某些东西的符号,标识的目的肯定是为了将这些东西区分开来。其实,标识符的作用就跟人类的名字差不多,为了区分每个人,就在每个人出生的时候起了个名字。

 

2> 上一篇文章说到:C语言是由函数构成的,一个C程序中可能会有多个函数,为了区分这些函数,就给每一个函数都起了个名称。函数的名称就是标识符的一种。除了函数,以后还会学到“变量”这个概念,变量的名称也是标识符

 

 

因此,上面的代码中:intreturn是关键字,main是标识符

 

 

 

3.标识符命名规则

 

标识符是由程序员自定义的,但是不能随便命名,它有以下几点命名规则:

 

1> 只能由26个英文字母的大小写10个阿拉伯数字0~9下划线_组成。

 

下面的标识符都是正确的:

 

test1    Mike2jack   My_tExt  

 

下面的标识符都是错误的:

 

test!32   haha(da)tt   哈哈_text

 

 

 

2> 严格区分大小写,同一段英文字母的大写和小写是两个不同的标识符。

 

比如:main和Main是两个不同的标识符

 

 

 

3> 不能以数字开头

 

下面的标识符都是错误的:

 

123haha  78text  98111

 

 

 

4> 不可以使用关键字作为标识符

 

下面的函数是错误的:

 

1 int int()
2 {
3     return 0;    
4 }

 

函数的名称是标识符的一种,而第1行的函数名称叫做int,int是C语言中的关键字,这是不合法的,肯定会报语法错误。

 

 

 

4.标识符命名规范

 

这个命名规范,你不一定要遵守。不过呢,90%的优秀程序员都是按照这个规范去走的。

 

1> 尽量起个有意义的名称,比如一个完整的英文单词,别人一看这个名称就能才能这个标识符的作用。如果不懂英文,你也可以用拼音,尽量不要起像abcde、sfsdfsdf等这类看起来没有意义的名称

 

2> 如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,或者使用下划线_来连接:first_name、my_first_name

 

 

 

 

三、注释

 

1.什么是注释

 

  • 注释是在所有计算机语言中都非常重要的一个概念,从字面上看,就是注解、解释的意思。
  • 注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流。假如我写完一行代码后,加上相应的注释,那么别人看到这个注释就知道我的这行代码是做什么用的。
  • 注释可以是任何文字,也就是说可以写中文。

 

注意:直接在代码中写上一大段中文是不行的,编译器会报错

 

1 这是一个主函数,C程序的入口点
2 int main() 
3 {
4     return 0;
5 }

 

第1行写了一段中文,用来解释main函数的作用,但是这段代码是不能编译成功的。第1行的中文并不叫注释,注释有它特定的格式。

 

 

 

2.注释的种类

 

C语言中一共有2种注释:单行注释、多行注释。大部分高级语言都有这2种注释。

 

1> 单行注释

 

单行注释以两个正斜杠开头,也就是以//开头,只能注释一行,从//开始到这行的结尾都是注释的内容

 

复制代码
1 #include <stdio.h>
2 
3 // 这是一个主函数,C程序的入口点
4 int main() 
5 {
6     // 这句代码可以在屏幕输出Hello World这一串文字
7     printf("Hello World");
8     return 0;
9 }
复制代码

 

第3行、第6行都是注释,注释在开发工具中一般都是绿色的。可以看出,这里第3行的注释是用来解释第4行代码的,第6行的注释是用来解释第7行代码的。一般就是这样写单行注释,用来解释某一行代码的作用。

 

 

 

注释也可以写在某条语句的后面

 

复制代码
1 #include <stdio.h>
2 
3 // 这是一个主函数,C程序的入口点
4 int main() 
5 {
6     printf("Hello World"); // 这句代码可以在屏幕输出Hello World这一串文字
7     return 0;
8 }
复制代码

 

第6行分号;后面的绿色文字都是注释。

 

 

 

如果将//放到printf的前面,那么整个第6行都属于注释。

 

复制代码
1 #include <stdio.h>
2 
3 // 这是一个主函数,C程序的入口点
4 int main() 
5 {
6     // printf("Hello World"); 这句代码可以在屏幕输出Hello World这一串文字
7     return 0;
8 }
复制代码

 

你会发现整个第6行都变成了绿色,说明整个第6行都是注释。

 

 

 

2> 多行注释

 

//只能用来注释一行文字,如果有多行文字都需要注释,那么就可以用多行注释。多行注释以/*开头,以*/结尾,/*和*/中间的内容都是注释。

 

复制代码
1 /*
2  作者:MJ
3  描述:第一个C语言程序
4  作用:这是一个主函数,C程序的入口点
5  */
6 int main() 
7 {
8     return 0;
9 }
复制代码

 

第1行到第5行的内容都是注释

 

 

 

3.注释的嵌套

 

1> 单行注释可以嵌套单行注释、多行注释

 

1 // 哇哈哈 // 呵呵呵
2 
3 // /* fsdfsdf */  // sdfsdfsd

 

这2行的所有内容都是注释

 

 

 

2> 多行注释可以嵌套单行注释

 

1 /*
2  // 作者:MJ
3  // 描述:第一个C语言程序
4  作用:这是一个主函数,C程序的入口点
5  */

 

这几行的所有内容都是注释

 

 

 

3> 多行注释不能嵌套多行注释

 

复制代码
1 /* 哈哈哈
2  
3  /*
4    嘻嘻嘻
5  */
6 
7   呵呵呵 */
复制代码

 

你会发现只有第1到第5行才是注释,第7行并不属于注释。因为/*找到第一个*/后就算注释结束了,而第1个*/在第5行。

 

 

 

4> 下面的写法是错误

 

1 // /*
2     哈哈哈
3  */

 

只有第1行是注释,第2~3行都不是注释

 

 

 

4.注释的细节

 

1> 注释是写给人看的,不是给计算机看的。计算机怎么可能看得我们写的中文嘛。因此,当编译程序的时候,并不会将注释编译到目标文件中

 

换句话说:被注释掉的语句是不会被执行的。

 

1 int main() 
2 {
3     // printf("Hello");
4     return 0;
5 }

 

第3行的语句被注释掉了,因此,运行程序的时候,并不会执行第3行的语句,屏幕上没有任何输出。

 

2> 要养成写注释的良好习惯。绝大部分项目经理检查下属代码的第一件事就是看有没有写注释,也有很多公司的机试也会检查注释(机试就是给你一道编程题、一台电脑,在规定时间内解题)。

 

3> 为什么注释这么重要呢?

 

  • 今天,你写了几百行代码,很高兴,做出了一个非常不错的功能,但是,忘了写注释。一个星期过后,你再回去看那一段代码,你可能完全看不懂了,这是很正常的事。如果你写了注释,那情况就不一样了,注释可以帮助你回顾代码的作用。
  • 你在某家公司待了1年多,写了10几万行代码,但是你不写一点注释。有一天你离职了,新的员工接手你做的项目,他首先要做的事情肯定是要读懂你写的代码。可是你一点注释都没写,10万行代码,全部都是英文,这会让这位新员工非常地蛋疼。每个人都有自己的思想,写代码的思路肯定是不一样的,看别人写的代码是件非常痛苦的事情,特别是没有注释的代码。你不写注释的做法会大大降低公司的开发效率。因此,所有的正规公司都非常重视注释。

 

 

 

5.注释的隐藏功能

 

1> 排错

 

其实,如果你利用得当的话,注释不仅仅是可以用来解释程序,还可以用来排除错误。

 

比如下面的代码

 

复制代码
1 #include <stdio.h>
2 
3 int main()
4 {
5     printf("111\n");
6     printf("222\n")
7     printf("333\n");
8     return 0;
9 }
复制代码

 

编译程序,你会发现编译失败。这个时候你可以将比较可疑的代码给注释了,比如注释第6行,因为感觉第6行好像少了点什么东西

 

复制代码
1 #include <stdio.h>
2 
3 int main()
4 {
5     printf("111\n");
6     // printf("222\n")
7     printf("333\n");
8     return 0;
9 }
复制代码

 

再编译一遍,发现编译成功了。说明就是第6行代码出错了!!!

 

 

 

2> 检查代码的作用

 

在工作中,偶尔会遇到自己不会做的功能,这时候我们就要去网上找一些别人写好的代码来填补自己的项目。但是别人写的代码不可能完全复合我们的需求啊,于是需要裁剪部分有用的代码出来,怎么知道哪一部分是有用的代码呢?那么你就要搞清楚每一行代码的作用。这个时候,我们利用注释来弄清楚每一行代码的作用。

 

比如,下面这段程序,我想知道第3行代码的作用

 

1 int main() 
2 {
3     printf("Hello");
4     return 0;
5 }

 

这个时候你可以先把程序运行一遍,看看运行效果,运行效果就是:在屏幕上输出了Hello这一串内容。

 

接着你把第3行代码注释了

 

1 int main() 
2 {
3     // printf("Hello");
4     return 0;
5 }

 

然后再运行一遍程序,发现屏幕上并没有输出以前的Hello。说明第3行代码的作用就是:在屏幕上输出了Hello这一串内容!!!总结来说,就是把注释后的运行效果跟以前的运行效果做一个对比,看看有没有少了什么效果,如果少了某些效果,说明被注释代码的作用就是实现这个少掉的效果。这句话可能有点绕,好好体会一下,对你大有帮助!

 

 

 

 

 

标签: iosiphoe应用开发ipad应用开发objective-c

和我一起来学iOS(四)UIView及其子类(下)UITableView

UITableView

 上节讲了一下UIView,这节接着讲它的重要子类,UITableView和UITableViewCell

通常来说,一个UITableView需要通过UITableViewController来指定它的样式。 当一个UITableViewController初始化的时候会创建UITableView的实例然后赋给自身的View属性,同时这个UITableView的两个属性dataSource和delegate都会指向UITableViewController。
@interface ItemsViewController : UITableViewController

 

复制代码
#import "ItemsViewController.h"

@implementation ItemsViewController

- (id)init
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {

    }
    return self;
}
复制代码


调用就如同上节所说的把它设为window的rootViewControlle

复制代码
#import "ItemsViewController.h"

@implementation HomepwnerAppDelegate

- (BOOL)application:(UIApplication *)application
    didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    ItemsViewController *itemsViewController = [[ItemsViewController alloc] init];

    [[self window] setRootViewController:itemsViewController];

    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}
复制代码

 

 

下图就是一个空的UITableView,由UITableViewController创建

接下来我们就要给它填充内容,看起来就像这样:

 


UITableViewCell

为了给UITableView填充内容,我们需要遵守UITableViewDataSource Protocol,其中有两个必须的方法,我们接来下会实现他们

– tableView:cellForRowAtIndexPath:  required method
– numberOfSectionsInTableView:
– tableView:numberOfRowsInSection:  required method
– sectionIndexTitlesForTableView:
– tableView:sectionForSectionIndexTitle:atIndex:
– tableView:titleForHeaderInSection:
– tableView:titleForFooterInSection:


UITableView包含了一个ContentView,而我们的具体内容都是包含在这个ContentView里,关系如下图所示:




真正的内容都是由textLabelimageViewUILabel这三个View所产生。下面的代码里我们会设置textLabel.


我们用一个Item类封装了ContentView所需的内容,然后用一个Store类来管理。具体代码就不写了,很简单,有经验的人一看头文件就懂。

复制代码
@class BNRItem;

@interface BNRItemStore : NSObject
{
    NSMutableArray *allItems;
}

+ (BNRItemStore *)defaultStore;
- (NSArray *)allItems;
- (BNRItem *)createItem;

@end
复制代码

 

 

接着在UITableViewCell,我们通过tableView:cellForRowAtIndexPath: 方法来创建一个Cell并显示

复制代码
- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                reuseIdentifier:@"UITableViewCell"];

    BNRItem *p = [[[BNRItemStore sharedStore] allItems]
                                    objectAtIndex:[indexPath row]];

    [[cell textLabel] setText:[p description]];

    return cell;
}
复制代码

具体要创建多少个cell是由方法- (NSInteger)tableView:numberOfRowsInSection:决定的,我们可以写死一个数字尝试下效果

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section
{
    return 1;
}

这时效果如图



我们可以根据自己的需要调节。


 

 完整的代码如下

复制代码
#import "ItemsViewController.h"
#import "BNRItemStore.h"
#import "BNRItem.h"

@implementation ItemsViewController
- (id)init 
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) {
        for (int i = 0; i < 10; i++) {
            [[BNRItemStore defaultStore] createItem];
        }
    }
    return self;
}

- (id)initWithStyle:(UITableViewStyle)style
{
    return [self init];
}

- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section
{
    return [[[BNRItemStore defaultStore] allItems] count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    UITableViewCell *cell =
        [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"];

    if (!cell) {
        cell = [[UITableViewCell alloc]
                    initWithStyle:UITableViewCellStyleDefault
                  reuseIdentifier:@"UITableViewCell"];
    }
 
    BNRItem *p = [[[BNRItemStore defaultStore] allItems]
                                    objectAtIndex:[indexPath row]];
    [[cell textLabel] setText:[p description]];
    return cell;
}
@end
复制代码

 


提高性能的一些做法(以后再详细说明):

滚动表视图时引发性能问题的不是解析nib文件,而 是要渲染多个子视图。当 UITableViewCell 拥有多个子视图时,iOS 的渲染机制会拖慢速度。 因此,代码生成的 UI 并不是要将 addSubView:方法放到 initWithStyle:reuseIdentifier 方法那里,而是要重写 drawRect 方法并以直接绘制内容的方式代替使用子视图。减少子视图(尤其是半透明的或下方还混有其他视图的)可以提高性能。


UITableViewCell
渲染方法中要避免的东西

绘制时要避免分配资源,包括 NSDateFormatterUIFont或任何在绘制时需要的对象。可以在类层级的初始化方法中执行分配工作,并将其存储为静态变量,并对每个表单元实例使用这个 静态变量。 



到目前为止这些都是挺简单的东西,下节我们要介绍好玩的东西,CALayer

posted on 2013-05-07 21:30  HackerVirus  阅读(955)  评论(0编辑  收藏  举报