(1). 注释符号
-
初探注释规则
由程序及结果分析发现:-
编译器会在编译过程使用空格替换整个注释
-
编译器认为双引号括起来内容都是字符串,双斜杠也不例外
-
“/……/”型注释不能被嵌套
-
-
Y=x/*p是什么意思?
作者本意:把 x 除以 *p 的结果赋值给 y
编译器:将 /* 作为一段注释开始,把 /* 后的内容都当成注释内容,直到 */ 出现为止
在编译器看来,注释和其它程序元素都是平等的,可以在 / 与 * 之间添加空格,所以,作为程序员也不能看轻注释。
-
注释注意
-
注释应该准确易懂,防止二义性,错误的注释有害而无利
-
一目了然的代码避免加注释
-
不要用缩写来注释代码,这样可能会产生误解
-
注释用于阐述原因,而不是用于描述程序的运行过程
-
注释符“//”后面尽量空一个格,再写注释,注释和代码段对齐,效果更好。
//高通代码注释 if (!nErr) { char* pTheme = 0; // Add form to formstack IVECTORMODEL_InsertAt(me->piForms, formIndex, piForm); IFORM_AddRef(piForm); // Set rootform IFORM_SetProperty(piForm, FID_ROOT, (uint32)po); // Log info IFORM_GetThemeBaseName(ROOTFORM_TO_IFORM(me), &pTheme); pTheme = (pTheme) ? pTheme : "(None)"; BUIT_LOG("FORMS EVT: Insert Set Theme Started for %s", pTheme); // Set theme on new form IFORM_ApplyTheme(piForm); BUIT_LOG("FORMS EVT: Insert Set Theme Finished for %s", pTheme); //RootForm_Update(me, FORMITEM_THEME, piForm); RootForm_StackChange(po); }
-
(2). 接续符和转义符
-
接续符的使用:
-
编译器会将反斜杠剔除,跟在反斜杠后面的字符自动解到前一行
-
在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格
-
接续符适合在定义宏代码块时使用(definede定义的宏必须在一行之内完成)
-
-
转义符
转义符()主要用于表示无回显字符,也可用于表示常规字符
#include <stdio.h> int main() { char enter = '\n'; char* p = "\141\t\x62"; printf("%s", p); printf("%c", enter); return 0; }
-
C 语言中的反斜杠 ( \ ) 同时具有接续符和转义符的作用:
-
当反斜杠作为接续符使用时可直接出现在程序中
-
当反斜杠作为转义符使用时必须出现在字符(单引号)或字符串(双引号)中
-
(3). 单引号和双引号
-
基本概念
-
C语言中的单引号用来表示字符字面量。
( ’a’ 表示字符常量在内存中占1个字节 ’a’ + 1表示 ’a’ 的ASCII码加1,结果为 ’b’) -
C语言中的双引号用来表示字符串字面量。
(”a” 表示字符串常量在内存中占2个字节,”a” + 1表示指针运算,结果指向 ”a” 结束符 ’\0‘) -
字符字面量被编译为对应的 ASCII 码,字符串字面量被编译为对应的内存地址。
-
printf的第一个参数被当成字符串内存地址。
-
内存的低地址空间不能在内存中随意访问。
-
-
混淆概念的代码
-
范例一
#include <stdio.h> int main() { char* p1 = 1; char* p2 = '1'; char* p3 = "1"; printf("%s, %s, %s", p1, p2, p3); printf('\n'); printf("\n"); }
p1, p2, p3 指针指向内存如下图所示,其中 p1, p2 指向的内存地址很低,而在一个操作系统里面,低位的地址一般保留起来给操作系统用的,我们一般操作0x08048000之后的地址。printf打印指针(也就是字符串),但p1, p2 指向内容不是字符串,故出现段错误。printf原型为printf(char* fmt ….) , printf(’\n’);表示指针fmt 指向 ‘\n’;(‘\n’的值为10),同理出现段错误。
-
范例二
#include <stdio.h> int main() { char c = " "; while(c == "\t" || c == " " || c == "\n") { scanf("%c", &c); } return 0; }
分析:
1. 编译后字符串" "的内存地址被赋值给变量 c
2. 内存地址占用4个字节,而变量c只占用1个字节
3. 由于类型不同,赋值后产生截断
-
(4). 逻辑运算符使用分析
-
程序中的短路规则
-
逻辑或(||)从左向右开始计算
-
当遇到为真的条件时停止计算,整个表达式为真;
-
所有条件为假时表达式才为假。
-
-
逻辑与(&&)从左向右开始计算:
-
当遇到为假的条件时停止计算,整个表达式为假
-
所有条件为真时表达式才为真。
-
-
-
&& 比 || 具有更高优先级
-
非(!)