C语言学习(二)符号

本文详细介绍了C语言中的基本符号,包括注释规则、编译器处理、接续符、转义字符、逻辑运算符、位运算符以及隐式类型转换,帮助读者理解C语言的核心构造和数据类型处理机制。
摘要由CSDN通过智能技术生成

        在C语言中,符号是构成程序的基本元素之一。认识和使用符号非常重要,本章节就是c语言中符号的学习。

        c语言中所有的基本符号如下表所示:


注释符号

C语言中的注释规则
        1、编译器如何处理注释:预处理阶段:编译过程的第一步通常是预处理,其中一项任务就是处理源代码中的注释。预处理器会扫描源代码,查找并移除所有注释,无论是单行注释还是多行注释。这意味着从预处理器输出到编译器的代码中已经不包含任何注释信息;注释移除单行注释:以 // 开头,直到行末的所有内容都被预处理器移除;多行注释:以 /* 开始,到 */ 结束的所有内容都被预处理器移除,不论这段注释跨越多少行;

        2、编译器在编译过程会删除注释,但是并不是简单的删除,而是用空格来代替;
        3、编译器任务双引号括起来的内容都是字符串,双斜杠也不例外;
        4、多行注释“ /*.....*/ ”不能嵌套使用,尝试在一个多行注释内再次开始一个多行注释(例如 /* 一个注释 /* 嵌套注释 */ 继续 */)会导致编译错误;
 


接续符号

        C语言中以反斜杠(\)表示断行。c语言编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。
接续符例子:在这个示例中,MAX 宏的定义使用了接续符 \ 来将宏的内容延续到下一行。

#define MAX(a, b) \
    ((a) > (b) ? (a) : (b))

        接续符使用注意事项:接续符后面不能有任何字符,包括空格和注释。如果有,编译器会当做语法错误。接续符适合在定义宏代码块时使用。


转义字符

       转义字符是一种特殊的字符序列,用于表示那些在字符串中无法直接表示的字符或控制代码。转义字符始终以反斜杠 \ 开始,后跟一个或几个字符,组合起来具有特殊的含义。 C语言中的转义字符(\)主要用于表示无回显字符,也可以用于表示常规字符。常规字符如下所示:

 :当反斜杠作为接续符使用时,可以直接出现在程序中;当反斜杠作为转义符使用时序出现在字符或者字符串中。 


单引号与双引号

        双引号引起来的都是字符串常量,单引号引起来的是字符常量。字符常量在内存中占1个字节,例如:‘a’ + 1表示‘a’的ASCII码加一,结果还是ASCII,是‘b’。“a”表示字符串常量,在内存中占2个字节。字符串常量是由双引号“ ”保卫的字符序列,在c语言中,字符串实际上是以空字符‘\0’(空终止符)结尾的字符数组。


逻辑运算符

        逻辑与:&&        逻辑或:||        逻辑非:!

        &&:        用法:expression1 && expression2。如果 expression1expression2 均为真(非零),则整个表达式的结果为真(1);否则为假(0)。如果 expression1 为假,则不会计算 expression2(短路行为);

        ||:        用法:expression1 || expression2。 如果 expression1expression2 中至少有一个为真(非零),则整个表达式的结果为真(1);只有当两者都为假(0)时,结果才为假。如果 expression1 为真,则不会计算 expression2(短路行为);

        !:        用法:!expression。如果表达式为真(非零),则返回 0(假);如果表达式为假(零),则返回 1(真);
        短路规则:逻辑与(&&)和逻辑或(||)运算符具有“短路”特性。        ||逻辑或表达式从左向右开始计算,当遇到为真的条件时,停止计算(后面还没有计算的条件不再进行计算),整个表达式为真,输出为真;所有表达式都为假时,输出为假。        &&逻辑与从左向右开始计算,当遇到为假的条件时停止计算,整个表达式为假;所有条件为真时输出为真。

        布尔上下文:在C语言中,任何非零值都被视为真,零值视为假。这一点在使用逻辑运算符时必须记住。在非运算中这条规则尤为重要,任何非零值取反都为真。

短路评估示例:

#include <stdio.h>

int main() {
    int a = 1;  // 初始值为真
    int b = 1;

    // 由于a是1(真),后面的表达式(b++)不会被执行
    if (a || b++) {
        printf("The condition is true.\n");
    }
    printf("b is still %d because the second part was not evaluated due to short-circuiting.\n", b);

    return 0;
}
#include <stdio.h>

int main() {
    int a = 0;  // 初始值为假
    int b = 1;

    // 由于a是0(假),后面的表达式(b++)不会被执行
    if (a && b++) {
        printf("This will not print.\n");
    }
    printf("b is still %d because the second part was not evaluated due to short-circuiting.\n", b);

    return 0;
}

逻辑之三目运算符

        三木运算符是一种用于在单个表达式内部进行条件判断的运算符。语法结构是:

expression1 ? expression2 : expression3

        这是一个条件表达式,通常结果为布尔类型(真或假)。这个表达式被评估,如果其结果为真(非零),则表达式的结果是 expression2;如果为假(零),则结果是 expression3;
 


位运算符

++、-- 操作符详解:

自加和自减操作符,用于变量的递增或者递减。这两种操作符各有两种形式,前缀形式和后缀形式。
前缀形式:++i、--i        运算符先增加或减少变量的值,然后返回变量的新值;
后缀形式:i++、i--        运算符先返回变量的当前值,然后增加或减少变量的值;
自加和自减运算符常用在for循环语句中;

C语言编译器的贪心原则:通常指的是编译器或解析器在处理代码时尽可能多地匹配输入数据的行为。
1、最大吞噬规则:编译器处理的每个符号尽可能多的包含字符;编译器以从左向右的顺序一个一个尽可能多的读入字符;当即将侞的字符不可能和已经读入的字符组成合法符号为止。
例子:

int a = 10;
int b = 20;
int result = a+++b;

        表达式 a+++b 实际上是 a++ + b 根据最大吞噬规则,编译器优先解释为 a++(a自增)和 + b(加b)

& 按位与:
        对于两个操作数,按位与操作对它们对应的每个位进行逻辑与操作。仅当两个相应的位都为1时,结果位才为1,否则为0。

| 按位或:
        对于两个操作数,按位或操作对它们对应的每个位进行逻辑或操作。如果两个相应的位中至少有一个为1,则结果位为1,否则为0。

^ 按位异或:
        对于两个操作数,按位异或操作对它们对应的每个位进行逻辑异或操作。如果两个相应的位不相同,则结果位为1;如果相同,则为0。

<< 左移运算符
        将一个数的所有位向左移动指定的位数。将右侧空出的位上填充0。常用于将一个值乘以2的幂。例如,x << 3 相当于将 x 乘以 2的三次方,x*8;         :x << -1;这种表达方式是错误的。

>> 右移运算符
        将一个数的所有位向右移动指定的位数。对于无符号数,左侧空出的位填充0;对于有符号数,依赖具体实现。常用于将一个值除以2的幂。例如,x >> 2 相当于将 x 除以2的2次方,x/4;

以上都是双目运算符。细节:按位与,按位或,按位异或这三个运算符只能用于整数类型或者字符类型。而且优先级比较低。

~ 按位取反 
        单目运算符。

防错准则:避免位运算符,逻辑运算符和数学运算符同时出现在一个表达式中;当位运算符,逻辑运算符和数学运算符需要同时参与运算时,尽量使用()来表达计算次序。


        逻辑运算符和位运算符的区别:&&|| 对操作数进行逻辑判断,而 &| 对操作数的二进制位进行操作;&&|| 具有短路特性,即第二个操作数可能不被计算,这可以优化性能;&| 总是计算两个操作数;&&|| 的结果总是 0 或 1,表示假或真;&| 的结果是整型,具体值取决于操作数的位值。


C语言中符号的优先级:





C语言中的隐式类型转换:
        在c语言中,隐式类型转换是指编译器在没有显式的指示的情况下自动进行的数据类型转换。发生这种转换的情况通常是:将一个数据类型的值赋给另一个不同数据类型的变量时,或在表达式中混合使用不同的数据类型时。隐式类型转换的目的是使在不同类型的值能够在运算中协同工作。
较小的整数类型(如 charshort)在参与运算之前通常会被提升(转换)为较大的整数类型(通常是 intunsigned int)。这种提升确保运算在更大的数据类型上执行,减少溢出的可能性,如下图:

  • 27
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值