Poedu_C语言提升_Lesson04_符号

  • 符号概述

    概览

    这里写图片描述

    []:常用来表示下标
    {}:常用来表示块
    波折号使用较少

    注释

    作用

    与其他程序员沟通

    沟通介质:代码,文档,注释

    方式

    1. //

      如:int num=0; //定义num

      注意:上例仅用做示例,此处一般不用加注释

    2. //

      如: 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,变得非常乖了,从左到右依次计算。而这就是逗号的作用了

作用:逗号运算符会让它从左到右运算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值