什么是标示符
日常生活中得标识符
- (img)
- 乔布斯/乔丹/陈冠希这些都是标识符
标识符就是程序员自己在程序中起的一些名字。
- 首先要明确的是,程序员自己起的名字,肯定是不能使用和关键字同名的名字。
2. 标识符的作用
标识符,从字面上理解就是用来标识某些东西的符号,标识的目的就是为了将这些东西区分开来
其实标识符的作用就跟人类的名字差不多,为了区分每个人,就在每个人出生的时候起了个名字
C语言是由函数构成的,一个C程序中可能会有多个函数,为了区分这些函数,就给每一个函数都起了个名称。函数的名称就是标识符的一种。除了函数,以后还会学到“变量”这个概念,变量的名称也是标识符
3.标识符命名规则
- 1.只能由26个英文字母的大小写、10个阿拉伯数字0\~9、下划线_组成
- 2.严格区分大小写,比如test和Test是2个不同的标识符
- 3.不能以数字开头
- 4.不可以使用关键字作为标识符
4.练习
fromNo12 |
my_Boolean |
Obj2 |
lnj |
Mike2jack |
_test |
haha(da)tt |
jack_rose |
GUI |
@: 2
标示符命名规范
本小节知识点:
- 【理解】标识符命名规范
- 【了解】标示符命名规范详述
- 【了解】其它标示符命名规范
1.标识符命名规范
- 命名规范:
- 起一个有意义名字,能够��高代码的可读性
- 驼峰命名(除开第一个单词后面每个单词首字母大写)
- (img)
- (img)
2.标示符命名规范详述
驼峰命名法(Camel-Case)是电脑程序编写时的一套命名规则(惯例):
程序员们为了自己的代码能更容易的在同行之间交流,所以才取统一的可读性比较好的命名方式。
- 例如:有些程序员喜欢全部小写,有些程序员喜欢用下划线,所以如果要写一个my name的变量,他们常用的写法会有myname、my_name、MyName或者myName。这样的命名规则不适合所有程序员阅读,而利用驼峰命名法来表示,可以增加程序可读性。
驼峰命名法就是当变量名或函数名是由一个或多个单字连结在一起,而构成的唯一识别字时,第一个单字以小写字母开始,第二个单字的首字母大写;或每一个单字的首字母都采用 大写字母
- 例如:myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。
驼峰命名法(Camel-Case)一词来自 Perl 语言中普遍使用的大小写混合格式,
而 Larry Wall 等人所著的畅销书《Programming Perl》(O~'~Reilly 出版)的封面图片正 是一匹骆驼。 驼峰命名法的命名规则可视为一种惯例,并无绝对与强制,为的是增加识别和可读 性。
不按照规范的后果
- (img)
3.其它标识符命名规范
命名应当直观且可以拼读,要望文知意,便于记忆和阅读。
- 标识符最好采用英文单词或其组合,不允许使用拼音。程序中的英文单词一般不要太复杂, 用词应当准确。
命名的长度应当符合“min-length && max-information”原则。
- C 是一种简洁的语言, 命名也应该是简洁的。例如变量名MaxVal 就比 MaxValueUntilOverflow 好用。标识符的长度一般不要过长,较长的单词可通过去掉“元音”形 成缩写。
- 另外,英文词尽量不缩写,特别是非常用专业名词,如果有缩写,在同一系统中对同一单词必 须使用相同的表示法,并且注明其意思。
- 大多数ANSI编译程序允许有至多31个有效字符。也就是说,只有变量名或函数名的前31个字符 的唯一性会被检查,其余的字符将被忽略掉。
比如: PrintOutAllTheClientsMonthEndReports(); prt_rpts();
当标识符由多个词组成时,建议采用“驼峰命名法”。
- 比如:int CurrentVal;这样的名字看起来比较清晰,远比一长串字符好得多。
尽量避免名字中出现数字编号,如Value1,Value2 等,除非逻辑上的确需要编号。
- 比如驱动开发时为管脚命名,非编号名字反而不好。 初学者总是喜欢用带编号的变量名或函数名,这样子看上去很简单方便,但其实是一颗颗定时炸 弹。这个习惯初学者一定要改过来。
对在多个文件之间共同使用的全局变量或函数要加范围限定符
- (建议使用模块名(缩写)作为范围限定符)。(GUI_ ,etc)标识符的命名规则
标识符名分为两部分:规范标识符前缀(后缀) + 含义标识。
- 非全局变量可以不用使用范围限定符前缀。
@: 3
注释基本概念
本小节知识点:
- 【掌握】什么是注释
- 【了解】为什么要使用注释?
- 【了解】应用注释的目的和应用场景
- 【理解】注释的特点
1.什么是注释
注释是在所有计算机语言中都非常重要的一个概念,从字面上看,就是注解、解释的意思
注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流。假如我写完一行代码后,加上相应的注释,那么别人看到这个注释就知道我的这行代码是做什么用的
- 注释可以是任何文字,也就是说可以写中文
- 在开发工具中注释一般是绿色
江哥提示:
” >+ 初学者编写程序可以养成习惯:先写注释再写代码。
” >+ 将自己的思想通过注释先整理出来,在用代码去体现。
” >+ 因为代码仅仅是思想的一种体现形式而已。
2.为什么要使用注释?
- 新浪微博表情键盘”其中一个”文件代码
~~ typedef enum{
~~ HMToolBarBtnTypeNear = 100,
~~ HMToolBarBtnTypeNormal,
~~ HMToolBarBtnTypeEmoji,
~~ HMToolBarBtnTypeLXH
~~ }HMToolBarBtnType;
~~
~~ @interface HMEmoticonsController ()<UICollectionViewDataSource, UICollectionViewDelegate>
~~ @property (weak, nonatomic) IBOutlet UICollectionViewFlowLayout *layout;
~~ @property (weak, nonatomic) IBOutlet UICollectionView *emoticonView;
~~ - (IBAction)emoticonToolbarClick:(UIBarButtonItem *)sender;
~~ @end
~~
~~ @implementation HMEmoticonsController
~~
~~ - (void)viewDidLoad {
~~ [super viewDidLoad];
~~ NSUInteger col = 7;
~~ NSUInteger row = 3;
~~ NSUInteger margin = 10;
~~ CGFloat screenWidth = [UIScreen mainScreen].bounds.size.width;
~~ CGFloat emoticonWidth = (screenWidth - (col + 1) * margin) / col;
~~ CGFloat emoticonHeight = emoticonWidth;
~~ self.layout.itemSize = CGSizeMake(emoticonWidth, emoticonHeight);
~~ self.layout.minimumInteritemSpacing = margin;
~~ self.layout.minimumLineSpacing = margin;
~~ self.layout.sectionInset = UIEdgeInsetsMake(margin, margin, margin, margin);
~~ self.layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
~~ self.emoticonView.pagingEnabled = YES;
~~ }
~~ - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
~~ {
~~ return [HMEmoticonsManager shareManager].emotionSections.count;
~~ }
~~
~~ - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
~~ {
~~ HMEmoticonSection *categoryScetion = [HMEmoticonsManager shareManager].emotionSections[section];
~~ return categoryScetion.emoticons.count;
~~ }
~~ - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
~~ {
~~ HMEmoticonCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[HMEmoticonCell identifier] forIndexPath:indexPath];
~~ HMEmoticonSection *categoryScetion = [HMEmoticonsManager shareManager].emotionSections[indexPath.section];
~~ HMEmoticon *emoticon = categoryScetion.emoticons[indexPath.item];
~~ cell.emoticon = emoticon;
~~ return cell;
~~ }
~~
~~ #pragma mark - UICollectionViewDelegate
~~ - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
~~ {
~~ HMEmoticonSection *categoryScetion = [HMEmoticonsManager shareManager].emotionSections[indexPath.section];
~~ HMEmoticon *emoticon = categoryScetion.emoticons[indexPath.item];
~~ HMEmoticonSection *nearSection = [HMEmoticonsManager shareManager].emotionSections[0];
~~ BOOL contain = NO;
~~ for (HMEmoticon *oldEmoticon in nearSection.emoticons) {
~~ if ([oldEmoticon.chs isEqualToString:emoticon.chs] ||
~~ [oldEmoticon.emoji isEqualToString:emoticon.emoji]) {
~~ contain = YES;
~~ break;
~~ }
~~ }
~~ if (!contain) {
~~ [nearSection.emoticons removeObjectAtIndex:nearSection.emoticons.count - 2];
~~ [nearSection.emoticons insertObject:emoticon atIndex:0];
~~ [self.emoticonView reloadData];
~~ }
~~ if ([self.delegate respondsToSelector:@selector(emoticonsController:emoticon:)]) {
~~ [self.delegate emoticonsController:self emoticon:emoticon];
~~ }
~~ }
~~
~~ - (IBAction)emoticonToolbarClick:(UIBarButtonItem *)sender
~~ {
~~ NSUInteger count = 0;
~~ // Emoji = 2
~~ for (int i = 0; i < sender.tag; i++) { // 0 1
~~ NSNumber *currentSectionCount = [HMEmoticonsManager shareManager].categroySections[i];
~~ count += currentSectionCount.intValue; // 7
~~ }
~~ CGRect rect = self.emoticonView.frame;
~~ rect.origin.x = count * rect.size.width;
~~ [self.emoticonView scrollRectToVisible:rect animated:YES];
~~ }
~~
- 阅读性差
3.应用注释的目的和应用场景
- 常见用法一(解释代码):
~~ - (UIBarButtonItem *)initWithNorImage:(NSString *)norimage higImage:(NSString *)higImage title:(NSString *)title target:(id)target action:(SEL)action
~~ {
~~ // 1.创建一个按钮
~~ UIButton *btn = [[UIButton alloc] init];
~~ // 2.设置按钮的默认图片和高亮图片
~~ if (norimage != nil &&
~~ ![norimage isEqualToString:@""]) {
~~ // 图片不为空
~~ [btn setImage:[UIImage imageNamed:norimage] forState:UIControlStateNormal];
~~ }
~~ if (higImage != nil &&
~~ ![higImage isEqualToString:@""]) {
~~ // 图片不为空
~~ [btn setImage:[UIImage imageNamed:higImage] forState:UIControlStateHighlighted];
~~ }
~~ // 设置标题
~~ [btn setTitle:title forState:UIControlStateNormal];
~~
~~ // 3.监听按钮的点击事件
~~ [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
~~ // 4.设置按钮的frame
~~ // 可以调用控件的sizeToFit方法来自动调整控件的大小
~~ [btn sizeToFit];
~~
~~ // 5.根据按钮创建BarButtonItem
~~ return [[UIBarButtonItem alloc] initWithCustomView:btn];
~~ }
- 常见用法二(做函数说明):
~~ /**
~~ * 创建item
~~ *
~~ * @param norimage 默认状态的图片
~~ * @param higImage 高亮状态的图片
~~ * @param title 标题
~~ *
~~ * @return 创建好的item
~~ */
~~ - (UIBarButtonItem *)initWithNorImage:(NSString *)norimage higImage:(NSString *)higImage title:(NSString *)title target:(id)target action:(SEL)action
~~ {
~~ // 1.创建一个按钮
~~ UIButton *btn = [[UIButton alloc] init];
~~ // 2.设置按钮的默认图片和高亮图片
~~ if (norimage != nil &&
~~ ![norimage isEqualToString:@""]) {
~~ // 图片不为空
~~ [btn setImage:[UIImage imageNamed:norimage] forState:UIControlStateNormal];
~~ }
~~ if (higImage != nil &&
~~ ![higImage isEqualToString:@""]) {
~~ // 图片不为空
~~ [btn setImage:[UIImage imageNamed:higImage] forState:UIControlStateHighlighted];
~~ }
~~ // 设置标题
~~ [btn setTitle:title forState:UIControlStateNormal];
~~
~~ // 3.监听按钮的点击事件
~~ [btn addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];
~~ // 4.设置按钮的frame
~~ // 可以调用控件的sizeToFit方法来自动调整控件的大小
~~ [btn sizeToFit];
~~
~~ // 5.根据按钮创建BarButtonItem
~~ return [[UIBarButtonItem alloc] initWithCustomView:btn];
~~ }
4.注释的特点
- 注释是写给人看的,不是给计算机看的。计算机怎么可能看得我们写的中文。因此当编译程序的时候,并不会将注释编译到.o目标文件中
- 从.o文件的大小可以间接看出注释后的代码并没有被编译
- 检查代码的作用
- 排除错误