嵌入式学习---在 Linux 下的 C 语言学习 Day2

Day2

C 语言编程基础

​ 终端默认为行缓冲 I/O 方式,在调用 scanf 函数输入数据时,只有按下回车键(即输入了换行符)系统会将你输入的数据提交给程序进行处理,并且所有输入的数据都会进入输入缓冲区(系统维护的一块内存空间)中暂存起来,scanf 函数从输入缓冲区的最前面提取它期望类型的数据,剩余的数据依旧保存在输入缓冲区中,后面调用 scanf 函数可以接着提取数据。如果调用 scanf 函数时输入缓冲区中没有任何数据,scanf 函数会等待用户按键输入,但如果输入缓冲区中有数据,并且数据不是 scanf 期望的数据,scanf 函数会立即失败返回。如果程序结束,输入缓冲区就会被释放。

​ 在使用行缓冲机制时,printf 函数并不是将数据直接输出到终端显示,而是将数据传送到输出缓冲区中暂存起来,当换行符进入输出缓冲区或输出缓冲区满了或程序正常结束时,系统会将输出缓冲区中的当前所有数据都一起推送到终端显示。

I/O:Input/Output,输入/输出。

C 语言主要内容:

  • 基本数据类型
  • 变量、常量
  • 运算符、表达式
  • 流程控制结构(顺序结构、选择结构、循环结构)
  • 函数
  • 复杂数据类型(数组、指针、结构体、共用体、枚举)

常量(Constant)

值不可改变的量就是常量。

常用的三种常量:

  • 字面量
  • 使用 const 关键字定义的常量(也称为常变量,只读变量)
  • 宏(使用 #define 定义)

整数字面量写法形式:

  • 123:int 类型,十进制形式
  • 123L:L 也可以小写,long 类型,十进制形式
  • 123U:U 也可以小写,unsigned int 类型,十进制形式
  • 0123L:long 类型,八进制形式
  • 0x123:int 类型,十六进制形式
int main()
{
        int i = 123;

        i = 0123; // 八进制形式

        i = 0x123; // 十六进制形式

        i = 0b101; // 二进制形式,某些编译器不支持

        printf("%d\n",i); // %d 表示十进制形式的 int 类型数据 
        printf("%o\n",i); // %d 表示八进制形式的 int 类型数据
        printf("%x\n",i); // %d 表示十六进制形式的 int 类型数据

        return 0;
}

浮点数字面量写法形式:

  • 十进制小数写法,例如:3.14、-5.12321、.456 等
  • 科学计数法写法,例如:1.24e3、-5.8E-3、9.123e-9 等

注意:上面两种写法形式都可以加上后缀F(或f),表示为 float 类型,否则为 double 类型

int main()
{
        long n = 123;

        n = 123L;
        n = 0x123L;
        n = 123;

        printf("%lu %lu\n",sizeof(3.14F),sizeof(3.14));

        return 0;
}

字符型字面量:用单引号将一个英文字符括起来,比如:‘a’、‘,’、‘\n’、’ ‘、’\0’、‘5’、‘\’’ 等

字符串字面量:用双引号将 0 个或多个任意字符括起来,比如:“”(空字符串)、“hello,china”、“a”、“你好”、“hello\nchina” 等

使用 const 关键字可以定义常量。语法规则如下:

// 举例如下
const double PI = 3.14159; // double const PI = 3.14159; 这两种写法等效
const int MAX_DEVICE_CNT = 255;

常量名的命名规则和变量一样,推荐的常量命名风格:由一个或多个有意义的单词构成,单词之间用下划线分隔,所有字母大写。

预处理命令:也称为预编译命令,以 # 开头的行就是预处理命令,比如:

#include <stdio.h> // 头文件包含预处理命令

#define PI 3.14    // 宏定义预处理命令,定义一个宏,宏名为PI,其值固定为 3.14,下面代码中不能改变其值

宏:macro

宏定义在实例开发中具有“一改全改”的效果,非常有利于代码的维护。

运算符(Operator)

实现运算功能的各种特殊符号,也称为操作符,不如:+、-、*、/、%、&、||、>、== 等。

C 语言支持非常丰富的各种运算符,借助它们就能实现各种数据处理操作。

操作数(Operand):参与运算的数据。

运算符就是对它的操作进行运算,得到一个结果数据。

根据运算符所支持的操作数个数不同,运算符可以分为三类:

  • 单目运算符(一元运算符):
  • 双目运算符(二元运算符):
  • 三目运算符(三元运算符):只有一个,即条件运算符(?😃

根据运算功能进行分类:

  • 算术运算符:+(加法运算符)、-(减法运算符)、*(乘法运算符)、/(除法运算符)、%(模运算符或取余运算符)、-(负号运算符)、++(自增运算符)、–(自减运算符)
  • 比较运算符:运算结果为布尔值(真True或假False),有:>、>=、<、<=、==、!=
#include <stdio.h>

int main()
{
    int a;
    
    a = 1 < 2;
    printf("%d\n",a); // 真为1 假为0

    a = 2 == 3;
    printf("%d\n",a);
    
    return 0;
}

/*
输出:
1
0
*/
  • 逻辑运算符:运算结果也是布尔值(真True或假False),其操作数也要求为布尔值,如果不是布尔值,会先自动转换为布尔值在进行运算,转换规则为:非零值为真,零转为假。有:!(逻辑非运算符,单目)、&&(逻辑与运算符,双目)、||(逻辑或运算符,双目)
#include <stdio.h>

int main()
{
    int b;
    
    scanf("%d",&b);
    b = 3 < b < 8; // 恒为真
    printf("%d\n",b); // 真为1 假为0
    
    return 0;
}
/*
输出:
1
*/
  • 位运算符:针对操作数的二进制位进行运算处理,切记:只有整数类型才支持位运算符,浮点数不支持。有:~(按位取反运算符)、&(按位与运算符)、|(按位或运算符)、^(按位异或运算符)、<<(按位左移运算符)、>>(按位右移运算符)。
  • 赋值运算符:运算结果为被赋值的数据,另外它具有一个运算效果,即将其左操作数的值修改为右操作数,所以其左操作数必须为变量。有:=、复合赋值运算符(+=、-=、*=、/=、!=、%=、&&=、||=)
  • 特殊运算符:条件运算符(?😃,逗号运算符(,)

模运算符(%)的运算结果的符号由它的左操作数决定,与右操作数的符号无关。

自增/自减运算符有两种用法形式:前置自增/自减运算符、后置自增/自减运算符。区分方法:运算符写在操作数左边就是前置,写在操作数右边就是后置。前置和后置的运算效果是一样的,都会使操作数的值自增一或自减一,所以其操作数必须为变量。它们的区别只是运算结果不同,后置的运算结果为操作数的原值,前置的运算结果为操作数加一或减一之后的值。

#include <stdio.h>

int main()
{
    int a = 3;
    int b = 4;
    
    a++;
    ++b;
    
    c = a++ + 2;
    d = 3 - ++b;
    
    printf("a = %d,b = %d\n",a,b);
    printf("c = %d,d = %d\n",c,d);
    
    return 0;
}

/*
输出结果:
a = 5,b = 6
c = 6,b = -3
*/

逻辑非运算特性:如果操作数为真,运算结果就为假,否则运算结果就为真。

逻辑与运算符特性:有“并且”之意,只有当它的两个操作数都为真时运算结果才为真,否则结果为假。

逻辑或运算符特性:有“或者”之意,只有当它的两个操作数都为假时才为假,否则结果为真。

逻辑与和逻辑或运算符具有“短路”效果。

#include <stdio.h>

int main()
{
    int a = 1,b = 2, c = 3;
    
    c = a < 2 || b++;
    printf("a = %d,b = %d,c = %d\n",a,b,c);
    
    return 0;
}

/*
输出结果:
a = 1,b = 2,c = 1
*/

运算符的运算结果是一个常量性质的临时数据,不能被赋值

条件运算符的运算特性:操作数1 ? 操作数2 :操作数3,首先会计算操作数1,如果其值为真或非零,就接着计算操作数2,并且将操作数2的值作为最终运算结果,操作数3直接忽略。如果操作数的1的值为假或零,就接着计算操作数3,并且将操作数3的值作为最终运算结果,操作数2直接忽略。

#include <stdio.h>

int main()
{
    int a = 4,b = 2, c = 3;
    
    c = a < 9 ? b++ : (a += 9);
    printf("a = %d,b = %d,c = %d\n",a,b,c);
    
    return 0;
}

/*
输出结果:
a = 4,b = 3,c = 2
*/

逗号运算符(,):优先级最低,双目运算符,左结合性,运算特性为:先计算左操作数,然后计算右操作数,并且将右操作数的值作为最终运算结果。

#include <stdio.h>

int main()
{
    int a = 6,b = 3, c = 2,d;
    
    d = (a = 3, b++,c -= 2);
    printf("a = %d,b = %d,c = %d,d = %d\n",a,b,c,d);
    
    return 0;
}

/*
输出结果:
a = 3,b = 4,c = 0,d = 0
*/

运算符有两个重要的属性:

  • 优先级:优先级高的运算符先运算,优先级低的运算符后运算
  • 结合方向:有两种结合防线,从左向右、从右向左。

小括号也可以看成运算符,它的优先级最高

在这里插入图片描述

学习方法:对于这张表不需要完全背下来,只需要记住下面总结的几点就够用了:

  • 最低的三个:逗号运算符最低,其次是赋值运算符,条件运算符是 C 语言中唯一的三目运算符,它的优先级正好是倒数第三
  • 括号优先级最高,所以以后在实际开发中,如果拿不准运算符的优先级,就多加括号控制运算顺序,千万不要想当然乱猜!
  • 单目运算符比双目运算符优先级高
  • 逻辑运算符的优先级各不一样,记住三个字:非与或
  • 在双目运算符中,优先级存在这个规律:算术运算符>比较运算符>逻辑运算符

表达式(Expression):由变量、常量、运算符、函数调用等构成的式子,注意:单个变量、单个常量、单个函数调用也是表达式,比如:1+2、i/3+j、get_count()+5、

常用进制转换

常用进制:

  • 二进制:Binary,BIN
  • 八进制:Octal,OCT
  • 十进制:Decimal,DEC
  • 十六进制:Hexadecimal,HEX
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值