符号概述
概览
[]:常用来表示下标
{}:常用来表示块
波折号使用较少注释
作用
与其他程序员沟通
沟通介质:代码,文档,注释
方式
//
如:int num=0; //定义num
注意:上例仅用做示例,此处一般不用加注释
/…/
如: int num=0; /* 定义num */
仅做示例
建议用//,因为/ * * /是不能够嵌套使用的
注:编译器自动生成的不用管
作用方式
注释将在编译过程中会被空格代替
如:int /* … */num;可编译
注释方式:
(1)准确易懂,没有二义性
(2)注释不能喧宾夺主:代码和思路是核心,注释是对代码的提示,在代码难以理解的时候用注释
(3)尽量不要缩写,这样就不是准确易懂的注释
(4)不要以聊天的方式来书写注释
接续符
作用
将当前行与后一行联系起来
使用示例
C语言中的语法是无法跨行的,(要么全部放到一行,要么用接续符)编译器在看到反斜杠的时候,会将接续符剔除,自动接到前一行
注意
(1)使用接续符,并不意味这这里有一个换行,只是告诉编译器,我后面还有内容,要继续读
(2)反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格,否则编译器因为无法识别而造成语法错误
单引号和双引号
先看三个示例:
char* p1=1;
char* p2=’1’;
char* p3=”1”;解析
char* p1=1;
指向内存地址为1的地方,而0~64之间的地址无法使用,所以会报错:无法访问char* p2=’1’;
指向数值为1的内存,’1’=0x32 ,同样也是无法使用的,编译器会报错。(与第一个的本质是一样的,都是指向了无法使用的空间)单引号所表示的也是数值,只是有其它的一些意义,可以用char去定义,但是不能用指针指向它
char *p3=”1”;
指向一个字符串,可以使用再来看一个示例:
char c=" ";
if(" " == c)
{
printf("Yes");
}在一些平台中能够编译通过(部分VS,gcc,g++)中能够编译通过,但是永远都不会进行printf的操作,因为c是一个数值,而” “代表的是一个地址。(注:此时c的值是’ ‘,因为“ ”所代表的是’ ”\0’)
逻辑运算符
(1) || (或)
有一个为真则为真
实验代码:
int main()
{
int i = 0, j = 0;
if (++i || ++j)
{
printf("i:%d j:%d", i, j);
}
return 0;
}复习一下,++i(左加加),会先进行自增,再执行语句
那么,最后会输出啥呢?
结果就是i:1 j:0,不知道你想的对不对呢。
为什么i是1,而j是0呢?
首先我们要知道:逻辑运算的短路都是从左到右
看if里里面的内容,从左到右是计算++i的值是否是为1,如果是为1,因为“||” 是只要有一个为真,那么,不管其它是否为真,if都是为真的。所以,编译器在判断i的值为1后,就不再做之后的++j了,也就是短路了!所以,j的值就没有发生自增。如果把++i改成i++,那么输出结果就是i:1 j:1了。小结:从左到右依次判断,当判断到值为1(为真)时,进行短路而不再执行后面的表达式
(2) && (与)
当条件都为真时为真
实验代码
int main()
{
int i = 0, j = 0;
if (++i && ++j)
{
printf("i:%d j:%d", i, j);
}
return 0;
}
因为 && 需要保证左右两边的条件都为真时才为真,所以必然要从左到右进行依次判断,什么时候停止呢?当条件为0(假)或者全部表达式判断完毕的时候。所以,最后的结果是i:1 j:1
如果把条件改为(i++ && ++j)呢?i和j的值会是多少呢?(答案是i:1 j:0)小结:从左到右依次判断,当判断到值为0(为假)时,进行短路而不再执行后面的表达式
(3) ! (取反)
取反操作得出来的值永远是0或1
示例:
!0=1
!1=0
!100=0
!(-1)=0反汇编角度可以看到压入的是1或0
(4)三目运算符:
格式表达式?真:假;
示例
num?ret=1:ret=0;
代码解析:num是否为真,如果为真,ret=1,否则ret=0
注意
三目运算符最后返回出来的是一个值,不可修改,需要修改,把返回值做成地址,加一个解引用(*)就可以进行修改了
(5)自增自减符
实验代码1
int main()
{
int i=0;
int j=(++i)+(++i)+(++i);
printf(“j=%d”,j);
return 0
}可以猜一下在VS下运行的结果
但这属于未确定的行为,每个编译器的处理方式不尽相同vs,gcc,g++等编译器,会将i++全部计算出来,然后再进行加法,所以上述实验代码的结果为9(i的自加操作做完后,此时i的值为3,再把三个i相加,在反汇编中可查看)
当没有括号的时候
int j=++i+++i+++i;
编译器会报错,因为编译器不知道该如何来解析它(贪心算法)
实验代码2
int main()
{
int i=0;
int x=(++i,++i,++i);
printf(“j=%d”,j);
return 0
}
结果又是怎样呢?
结果是3,变得非常乖了,从左到右依次计算。而这就是逗号的作用了作用:逗号运算符会让它从左到右运算