C语言深度扩展——2. 符号的技巧(上)

本文详细探讨了C语言中的一些关键符号,包括注释规则、接续符和转义符的使用、单引号与双引号的区别以及逻辑运算符的短路规则。注释的正确使用对代码的可读性至关重要,接续符和转义符有助于代码布局,而单引号和双引号则分别对应字符和字符串。逻辑运算符的短路特性影响了表达式的求值顺序。
摘要由CSDN通过智能技术生成

(1). 注释符号

  1. 初探注释规则

    Alt
    由程序及结果分析发现:

    • 编译器会在编译过程使用空格替换整个注释

    • 编译器认为双引号括起来内容都是字符串,双斜杠也不例外

    • “/……/”型注释不能被嵌套

  2. Y=x/*p是什么意思?

      作者本意:把 x 除以 *p 的结果赋值给 y

      编译器:将 /* 作为一段注释开始,把 /* 后的内容都当成注释内容,直到 */ 出现为止

      在编译器看来,注释和其它程序元素都是平等的,可以在 / 与 * 之间添加空格,所以,作为程序员也不能看轻注释。

  3. 注释注意

    1. 注释应该准确易懂,防止二义性,错误的注释有害而无利

    2. 一目了然的代码避免加注释

    3. 不要用缩写来注释代码,这样可能会产生误解

    4. 注释用于阐述原因,而不是用于描述程序的运行过程

    5. 注释符“//”后面尽量空一个格,再写注释,注释和代码段对齐,效果更好。

      //高通代码注释
      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). 接续符和转义符

  1. 接续符的使用:

    1. 编译器会将反斜杠剔除,跟在反斜杠后面的字符自动解到前一行

    2. 在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格

    3. 接续符适合在定义宏代码块时使用(definede定义的宏必须在一行之内完成
      Alt

  2. 转义符

    转义符()主要用于表示无回显字符,也可用于表示常规字符

    Alt

        #include <stdio.h>
        
        int main()
        {
            char enter = '\n';
            
            char* p = "\141\t\x62";
            
            printf("%s", p);
            printf("%c", enter);
            
            return 0;
        }
    

Alt

  1. C 语言中的反斜杠 ( \ ) 同时具有接续符和转义符的作用:

    1. 当反斜杠作为接续符使用时可直接出现在程序中

    2. 当反斜杠作为转义符使用时必须出现在字符(单引号)或字符串(双引号)中

(3). 单引号和双引号

  1. 基本概念

    1. C语言中的单引号用来表示字符字面量。
      ( ’a’ 表示字符常量在内存中占1个字节 ’a’ + 1表示 ’a’ 的ASCII码加1,结果为 ’b’)

    2. C语言中的双引号用来表示字符串字面量。
      (”a” 表示字符串常量在内存中占2个字节,”a” + 1表示指针运算,结果指向 ”a” 结束符 ’\0‘)

    3. 字符字面量被编译为对应的 ASCII 码,字符串字面量被编译为对应的内存地址。

    4. printf的第一个参数被当成字符串内存地址。

    5. 内存的低地址空间不能在内存中随意访问。

  2. 混淆概念的代码

    1. 范例一

      #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");
      }
      

      Alt
      Alt
         p1, p2, p3 指针指向内存如下图所示,其中 p1, p2 指向的内存地址很低,而在一个操作系统里面,低位的地址一般保留起来给操作系统用的,我们一般操作0x08048000之后的地址。printf打印指针(也就是字符串),但p1, p2 指向内容不是字符串,故出现段错误。

         printf原型为printf(char* fmt ….) , printf(’\n’);表示指针fmt 指向 ‘\n’;(‘\n’的值为10),同理出现段错误。

    2. 范例二

      #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. 由于类型不同,赋值后产生截断

      Alt

(4). 逻辑运算符使用分析

  1. 程序中的短路规则

    1. 逻辑或(||)从左向右开始计算

      • 当遇到为真的条件时停止计算,整个表达式为真;

      • 所有条件为假时表达式才为假。

    2. 逻辑与(&&)从左向右开始计算:

      • 当遇到为假的条件时停止计算,整个表达式为假

      • 所有条件为真时表达式才为真。

      Alt

  2. && 比 || 具有更高优先级

    AltAlt

  3. 非(!)

    Alt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值