Linux开发之C语言基础

2025-10-22 06:50:35

1、常量: 

数字    十进制数(Dec)  20  

八进制(Oct) 024  

十六进制(Hex)  0x14 

二进制数(Bin)  0b10100

字符 ‘ ‘    man ascii  :

Linux开发之C语言基础

2、转义字符 在字符中用\表示:

Linux开发之C语言基础

3、还有和八进制或者十六进制数字联合一起的转义字符,表示取对应的ASCII码值:

Linux开发之C语言基础

4、练习:

定义一个char类型变量, 尝试用不同的方式给该变量赋值, 并打印结果;

char   x = ‘a’;

char   y = 97;

printf(“x = %c ,   x=0x%x \n”, x, x );

printf(“y = %c ,   y=0x%x \n”, y, y );

字符串 “ ”

“hello”   只要有双引号,在字符串的最后就会有一个空字符’\0’

     ‘h’  ‘e’  ‘l’   ‘l’   ‘o’   ‘\0’

5、变量:

在运行过程中数值会发生变化的

变量名是由字母和下划线开头,由数字、字母、下划线组成的

定义一个字符型变量

char   c = ‘a’ ; // 用常量‘a’给变量c赋初值

char   _3c = ‘a’ ;

char   val = ‘a’ ;

以上,实际写入到内存的是字符‘a’所对应的ASCII码值

 Oct   Dec   Hex   Char

 141   97    61      a

char   c = ‘a’ ;  ==等价于=> char   c = 97 ;

变量的定义:

按数据类型在内存中申请指定大小的字节空间

1)【数据的作用域】   数据类型   变量名;

2)【数据的作用域】   数据类型   变量名 = 初值;

作用域: static  静态变量  ,按需求设置

数据类型 :  是必须的

基本数据类型有:

Linux开发之C语言基础

6、%d需要把这个数据当成是带符号的补码,需要显示出其原码:

Linux开发之C语言基础

7、思考: char  a = 135;

   和 unsigned char  b = 135 ;

  实际写入内存的有没有区别? (没有)

  在使用的时候有没有区别?

(自动类型转换 带符号转成无符号~)

a+5 和 b+5的结果是否一致

结果用打印没有区别

 

short  短整型

 占用2个字节(2Byte , 2B)

(-215~~ 215-1 )

 unsigned short  (0~~ 216-1 )

 

int     32位占用4个字节(4Byte , 4B)

  64位占用4个字节(4Byte , 4B)

 unsigned int

float  单精度浮点型   带有小数点   %f

32位占用4个字节(4Byte , 4B)

  64位占用4个字节(4Byte , 4B)

 unsigned float

float   x = 0.01;

float  x = 1e-2 ;

float   y = 10000.0;

float  y = 1e4 ;

 

long  长整型   %ld   %lu   %lx

32位占用4个字节(4Byte , 4B)

  64位占用8个字节(4Byte , 4B)

  unsigned long

double 双精度浮点型  带有小数点的  %lf

32位占用8个字节(4Byte , 4B)

   64位占用8个字节(4Byte , 4B)

 unsigned double 

long double类型用%llf打印

 

bool / _Bool  

需要加头文件

#include <stdbool.h>

布尔变量, 用来判断真假及条件是否成立,只能是0或者1

true 为1     false 为0

类型转换

int a = 5;

double  b = a / 2 ;

请问b为多少  2.000000   在除的时候,a依旧是int整型,

          a/2得到的是整数部分,所以就是整数2

  赋值的时候double就会把2变成是带小数点的浮点数,赋值给b (自动类型转换)

a / 2 为多少              a/2得到的是整数部分,所以就是整数2

(double)a/2     其中是先对整型变量a做了强制类型转换,

在这条语句中暂时作为浮点数进行运算,

(double)a/2得到的就是2.500000

(double) (a/2)     是把a/2的结果强制类型转换,

   a/2得到的是整数部分,所以就是整数2

(double)(a/2) = 2.000000

自动类型转换在运算过程中自己转换的

强制类型是针对变量或者表达式或者函数的返回值,用(新类型)来实现强制类型转换

 

表达式和语句

表达式 由变量、运算符等组成

a=1   a +1  a+b  a++   a > b

语句才可以代码中独立存在, 必须有分号

 a +=1;   a+1 ; 

8、运算符

int  val = 100;

赋值运算符:

Linux开发之C语言基础

9、算术运算符:

Linux开发之C语言基础

10、关系运算符 是用来描述两个数之间的关系:

Linux开发之C语言基础

11、练习:test1

输入一个小写字符, ‘a’  ‘z’

显示该字符对应大写字符,连续显示4次

输入‘a’  ,输出是AAAA  

字符的输入和显示 用%c

char c ;

scanf(“%c” , &c);

for( i=0; i<4; i++ )

printf(“%c”, c-32);

 

逻辑运算符

逻辑与  &&

条件1 && 条件2

只有这两个条件都满足(条件为真)整个表达式才为真

只要有一个为假就是假

如果条件1已经是假,不会处理条件2

例:判断输入的是否为小写字符:

char c ;  

scanf(“%c” , &c);    // ‘a’  ‘z’     ‘z’ >= c >= ‘a’ 数学上写法

if(  c >= ‘a’    &&    ‘z’ >= c  )

逻辑或  ||

条件1 || 条件2

只有有一个条件满足(条件为真)整个表达式就为真

只有这两个条件都不满足(条件都为假)整个表达式才为假

如果条件1已经是真,不会处理条件2

if (   小写字符  ||   大写字符  )

    ‘a’ ~ ‘z’    ‘A’ ~ ‘Z’

判断一个字符是否为英文字符

if (  (c >= ‘a’ && ‘z’ >= c )  ||  (c >= ‘A’ && ‘Z’ >= c )  )

练习 test2.c

输入一个字符, 英文字符或者数字字符

如果是小写字符就显示该字符对应大写字符,连续显示4次

如果是大写字符或者数字字符就显示输入出错

12、---------------------------------------------------------------------------- 

scanf(“%c”, &ch)  不管键盘的缓冲区里面有什么数据 都会读取之并当成是字符

如果需要清空缓冲区,常用

Linux开发之C语言基础

13、%d只取+-0123456789

%x只取xX0123456789abcdefABCDEF

%s 可以取键盘上所有键值,除了空格和回车

--------------------------------------------------------------------------

逻辑非  !

单目运算符 

!条件     如果条件为真, 整个表达式为假

如果条件为假,整个表达式为真

非零就是真

分析: !val

 如果val 的值为1 , 请问 !val  判断结果为假

 如果val 的值为0 , 请问 !val  判断结果为真

分析   ! (a>b)

 如果a的值为10 ,b的值为12,

 ! (a>b)  a>b不成立 ,这个表达式是真的

 如果a的值为15 ,b的值为12,

 ! (a>b)  a>b成立 ,这个表达式是假的

 

位运算符

   针对bit做操作    1Byte有8bits

   位与运算符 &   对应位相与 都为1才为1 ,否则为0

如  unsigned char val = 10;

    val & 0x01 ==》    0000  1010

& 0000  0001

   0000  0000

1) 用于判断某一位是为1还是0

如 判断一个unsigned char数据的最低位是否为1

   unsigned char val ;

 .........

如果 val & 0x01 != 0 说明最后一位是1

如果 val & 0x01 == 0 说明最后一位是0

2)  用来令某一位为0

如 令unsigned char val 的第3位为0

              

 val & 0b11110111

位或运算符 | 对应位相或 都为0才为0 ,否则为1

如  unsigned char val = 10;

    val | 0x01 ==》     0000  1010

|  0000  0001

   0000  1011

用于把某一位置成1

如 保证unsigned char val 的第4位为1

 val | 0b00010000

左移运算 <<  把数据按要求向左移动指定位数

  直接把高位移走, 低位补0

  对数据逐位进行操作

  在数据没有越界的情况下, 左移n位就相当于乘以2n

右移运算 >>  把数据按要求向右移动指定位数

  直接把低位移走, 如果是带符号数 高位补符号位(负数补1, 正数补0)

  如果是无符号数,直接高位补0

  对数据逐位进行操作

  在非负数进行操作的情况下, 右移n位就相当于除以2n

 

思考:

如何把无符号char类型的数据对应的十六进制、十进制、八进制、二进制给输出?

 unsigned char val ;

 scanf(“%hhu” ,  &val );

 printf(“ 0x%hhx ,  %hhu ,  0%hho  ”,  val , val , val );

二进制数: 1)用整除、模除2的方式

       2)利用位与、位移操作得到各二进制的值

 

位异或  ^

位反  ~

其它运算符

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢