商城网站设计公司排名,帝国做网站,微同网 我的网站移动版,百度搜索风云榜单注释符号
几个似非而是的注释问题
例子#xff1a;
(A) int / * ... * /i;
(B) char * s abcdefgh //hijklmn;
(C) //Is it a \valid comment?
(D) in/ * ... * /t i;
我们知道C语言里可以有两种注释方式#xff1a;“/* */” 和 “ // ”。那么上面几条…注释符号
几个似非而是的注释问题
例子
(A) int / * ... * /i;
(B) char * s abcdefgh //hijklmn;
(C) //Is it a \valid comment?
(D) in/ * ... * /t i;
我们知道C语言里可以有两种注释方式“/* */” 和 “ // ”。那么上面几条注释是否正确。
A中有人认为Bain一起剔除掉注释后代码会被解析成int i所以不正确。编译器的确会将注释剔除但不是简单的剔除而是 用空格代替原来的注释 。 如/* 这是*/ # /*一条*/ define /*合法的*/ ID /*预处理 */ replacement /*指*\ list /* 令*/ B中我们知道双引号引起来的都是字符串常量那双斜杠也不例外。 C中这是一条合法的注释因为“\”是一条接续符。 D中前面说过注释会被空格替换那这里也很好理解了。
y x /*p 只要斜杠/和星号*之间没有空格都会被当作注释的开始这一点一定要注意。怎么写出出色的注释 注释应当准确、易懂、防止有二义性。错误的注释不但无益反而有害边写代码边注释修改代码的同时修改相应的注释以保证注释与代码的一致性注释太多了会让人眼花缭乱。一目了然的语句不加注释。对于全局数据全局变量、常量定义等必须要加注释。注释采用英文尽量避免在注释中使用缩写特别是不常用的缩写。注释的位置应与被描述的代码相邻可以与语句在同一行也可以在上行但不可放在下方。同一结构中不同域的注释要对齐。当代码比较长特别是有多重嵌套时应当在一些段落的结束处加注释便于阅读。注释的缩进要与代码的缩进一致。注释代码段应注重“为何做why”而不是“怎么做how”数值的单位一定要注释。对变量的范围给出注释尤其是参数。对一系列的数字编号给出注释尤其在编写底层驱动程序的时候比如引脚编号。对于函数的入口/出口数据、条件语句、分支语句给出注释。避免在一行代码或表达式的中间插入注释。复杂的函数中在分支语句、循环语句结束之后需要适当的注释方便区分各分支或循环体。对于不需要被编译的区域要使用条件编译来实现例如使用带有注释的 #if 或 #ifdef 结构。 接续符和转义符
C语言里以反斜杠\表示断行。编译器会将反斜杠剔除掉跟在后面的字符自动续接到前一行。但是注意反斜杠之后不能有空格反斜杠的下一行之前也不能有空格。 反斜杠除了可以被用作接续符外还能被用做转义字符的开始标识。常用的转义字符以及含义如下图
单引号、双引号
双引号引起来的都是字符串常量单引号引起来的都是字符常量。
逻辑运算符
“ || ”和“ ”是我们经常用到的逻辑运算符与按位运算符“ | ”和“ ”是两码事。
int i 0;
int j 0;
if ((i 0) || (j 0))
{// 打印出i和j的值
}//结果 i 1; j 0;
不要惊讶。逻辑运算符“ || ”两边的条件只要有一个为真其结果就为真逻辑运算符“ ”两边的条件只要有一个结果为假其结果就为假。if ((i 0) || (j 0))语句中先计算i 0,发现其结果为真后面的(j 0)便不再计算同样“”运算符也要注意这种情况。这是容易出错的地方。在某些情况下逻辑运算符可以代替if语句
int a 3;
int b 5;
if (a b)
{a b;
}
/************/
//等同于
(a b) (a b);//如果前面为假则整体为假后面也不需要执行
//如果前面为真还要考虑后面是否为真继续执行后面的式子
位运算符
C语言中位运算包括下面几种 ……按位与 | …….按位或 ^…….按位异或 ~…….取反 ….左移 ….右移 前四种操作很简单一般不会出错。但要注意按位运算符“ | ”和 “ ”与逻辑运算符“ || ”和 “ ”完全是两码事别混淆了。其中按位异或操作可以实现不用第3个临时变量交换两个变量的值 a ^b; b ^ a; a ^ b;但并不推荐这么做因为这样的代码读起来很费劲。 位操作需要用宏定义好后再使用。 //例如常用的位操作宏
#define SETBIT(x, y) ((x) | (y))
#define CLRBIT(x, y) ((x) ~(y)) // 要十分小心y是否是有符号数
//建议不适用取反操作而是自己计算需要的值否则非常容易出错
#define TOGLBIT(x, y) ((x) ^ (y))
#define TESTBIT(x, y) ((x) (y)) 如果位操作符’~’和‘’ 应用于基本类型无符号字符型或无符号短整型的操作数结果会立即转换成操作数的基本类型。 #include stdint.h
#inlcude stdio.h
int main()
{uint8_t port 0x5aU;uint8_t result_8;uint16_t result_16;result_8 (~port)4; //不能得到期待的0xa5result_8 ((uint8_t)(~port))4; //正确的写法result_16((uint16_t)(~(uint16_t)port))4; //正确的写法return 0;
} 位运算符不能用于基本类型underlying type是有符号的操作数上。一元减运算符不能用在基本类型无符号的表达式上除非在使用之前对两个操作数进行大小判断且被减数必须大于减数 左移和右移 左移运算符“”是双目运算符其功能是把“”左边的运算数的各二进位全部左移若干位由“”右边的数制定移动的位数高位丢弃地位补0. 右移运算符“”是双目运算符其功能是把“”左边的运算数的各二进位全部右移若干位由“”右边的数制定移动的位数。但注意对于有符号数在右移时符号位将随同移动。当为正数时最高位补0而为负数时符号位为1最高位补0或是补1取决于编译系统的规定。Turbo C和很多系统规定补1. 左移和右移的位数不能大于和等于数据的长度不能小于0. 、- - 操作符 之前的博客里有这方面的介绍传送门) 贪心法每一个符号应该包含尽可能多的字符。还需要注意的是除了字符串和字符常量符号的中间不能嵌有空白空格、制表符、换行符等比如是单个符号而是两个等号 除法 三条性质 最重要的一点我们希望q * b r a因为这是定义余数的关系。如果我们改变 a 的正负号希望 q 的符号也随之改变但 q 的绝对值不会变。当 b 0 时我们希望保证r 0 且 r b . 但是他们不能同时成立。大多数编程语言选择了放弃第3条而改为要求余数与被除数的正负号相同这样性质1和性质2就可以得到满足。大多数 C 语言编译器也都是如此。 运算符的优先级 记忆技巧 ① 伪运算符的优先级最高单目运算符优先级总是高于双目 ② 对于双目运算符而言算术运算位运算逻辑运算 ③ 自右向左结合的运算符只有单目运算符和赋值运算符。
2 一些容易出错的优先级问题见下表。