C语言数据类型和变量

1.数据类型介绍

c语言中提供了丰富的数据类型来描述各种数据,以下为C语言中提供的各种数据类型:

1.1字符型

1.char

2.[signed] char //有符号

3.unsigned char //无符号

1.2整型

// 短整型
short [ int ]
[ signed ] short [ int ]
unsigned short [ int ]
// 整型
int
[ signed ] int
unsigned int
// ⻓整型
long [ int ]
[ signed ] long [ int ]
unsigned long [ int ]
// 更⻓的整型
//C99 中引⼊
long long [ int ]
[ signed ] long long [ int ]
unsigned long long [ int ]

 1.3浮点型

float //单精度浮点型

double //双精度浮点型

long double 

1.4布尔类型

C语言原来并不存在这一类型,但在C99( C语言的官方标准第二版)中引入了布尔类型来判断真假

-Bool

注意:布尔类型必须加上头文件<stdbool.h>

           布尔类型变量的取值是:true 或 false

1.5各种数据数据类型的长度

 sizeof操作符

sizeof可以用来计算各种数据类型的长度,长度的单位为字节,操作方式如下:

# include <stdio.h>
int main ()
{
  printf ( "%zd\n" , sizeof ( char ));              //1个字节
  printf ( "%zd\n" , sizeof ( _Bool ));           //1个字节
  printf ( "%zd\n" , sizeof ( short ));            //2个字节
  printf ( "%zd\n" , sizeof ( int ));                //4个字节
  printf ( "%zd\n" , sizeof ( long ));             //4个字节
  printf ( "%zd\n" , sizeof ( long long ));     //8个字节
  printf ( "%zd\n" , sizeof ( float ));             //4个字节
  printf ( "%zd\n" , sizeof ( double ));        //8个字节
  printf ( "%zd\n" , sizeof ( long double ));//8个字节
  return 0 ;
}

2.signed 和 unsigned 

C 语⾔使⽤ signed unsigned 关键字修饰字符型和整型类型的。
signed 关键字,表⽰⼀个类型带有正负号,包含负值;
unsigned 关键字,表⽰该类型不带有正负号,只能表⽰零和正整数。
对于 int 类型,默认是带有正负号的,也就是说 int 等同于 signed int
由于这是默认情况,关键字 signed ⼀般都省略不写,但是写了也不算错。
signed int a;
  // 等同于 int a;
int 类型也可以不带正负号,只表⽰⾮负整数。这时就必须使⽤关键字 unsigned 声明变量。
unsigned int a;

整数变量声明为 unsigned 的好处是,同样⻓度的内存能够表⽰的最⼤整数值,增⼤了⼀倍。
⽐如,16位的 signed short int 的取值范围是:-32768~32767,最⼤是32767;⽽
unsigned short int 的取值范围是:0~65535,最⼤值增⼤到了65,535。
当然signed 和 unsigned不仅能用于int类型变量,也能用于char等,他们的作用效果都类似。

3.数据类型的取值范围

上述的数据类型很多,尤其数整型类型就有short、int、long、long long 四种,为什么呢?
其实每⼀种数据类型有⾃⼰的取值范围,也就是存储的数值的最⼤值和最⼩值的区间,有了丰富的类
型,我们就可以在适当的场景下去选择适合的类型。如果要查看当前系统上不同数据类型的极限值:
limits.h ⽂件中说明了整型类型的取值范围。
float.h 这个头⽂件中说明浮点型类型的取值范围。
为了代码的可移植性,需要知道某种整数类型的极限值时,应该尽量使⽤这些常量。
SCHAR_MIN SCHAR_MAX :signed char 的最⼩值和最⼤值。
SHRT_MIN SHRT_MAX :short 的最⼩值和最⼤值。
INT_MIN INT_MAX :int 的最⼩值和最⼤值。
LONG_MIN LONG_MAX :long 的最⼩值和最⼤值。
LLONG_MIN LLONG_MAX :long long 的最⼩值和最⼤值。
UCHAR_MAX :unsigned char 的最⼤值。
USHRT_MAX :unsigned short 的最⼤值。
UINT_MAX :unsigned int 的最⼤值。
ULONG_MAX :unsigned long 的最⼤值。
ULLONG_MAX :unsigned long long 的最⼤值。

4.变量

4.1变量的创建

数据类型是用来创建变量的,C语言中把经常变化的量称为变量,不变的量称为常量,变量的创建形式如下
data_type name;
       |             |
       |             |
数据类型 变量名

变量在创建的过程中给一个初始值,就叫做初始化

int age = 18 ;
char ch = 'w' ;
double weight = 48.0 ;

4.2变量的分类

变量分为全局变量和局部变量两种

  全局变量:在⼤括号外部定义的变量就是全局变量
全局变量的使⽤范围更⼴,整个⼯程中想使⽤,都是有办法使⽤的。
局部变量:在⼤括号内部定义的变量就是局部变量
局部变量的使⽤范围是⽐较局限,只能在⾃⼰所在的局部范围内使⽤的。
当全局变量和局部变量名字相同时,优先使用局部变量

5.算术操作符

  C语⾔中为了⽅便运算,提供了⼀系列操作符,其中有⼀组操作符叫:算术操作符。分别是: + - * / % ,这些操作符都是双⽬操作符。
   5.1+和-
  
+ - ⽤来完成加法和减法。
+ - 都是有2个操作数的,位于操作符两端的就是它们的操作数,这种操作符也叫双⽬操作符。
# include <stdio.h>
int main ()
{
  int x = 4 + 22 ;
  int y = 61 - 23 ;
  printf ( "%d\n" , x);
  printf ( "%d\n" , y);
  return 0 ;
}

    5.2*

运算符 * ⽤来完成乘法。

# include <stdio.h>
int main ()
{
int num = 5 ;
printf ( "%d\n" , num * num); // 输出 25
return 0 ;
}

   5.3  /

运算符 / ⽤来完成除法。
除号的两端如果是整数,执⾏的是整数除法,得到的结果也是整数。

  5.4 %

运算符 % 表⽰求模运算,即返回两个整数相除的余值。这个运算符只能⽤于整数,不能⽤于浮点数。
如果是负数进行求模,负数求模的规则是,结果的正负号由第⼀个运算数的正负号决定。

6.赋值操作符:=和复合赋值

在变量创建的时候给⼀个初始值叫初始化,在变量创建好后,再给⼀个值,这叫赋值
=为赋值操作符。
C语⾔中提供了复合赋值符,⽅便我们编写代码,这些赋值符有:
+=    -=
>>=      <<=
&=          |=      ^= 

7.单目操作符 :++,--,+,-

前⾯介绍的操作符都是双⽬操作符,有2个操作数的。C语⾔中还有⼀些操作符只有⼀个操作数,被称
为单⽬操作符。 ++ -- +( ) -( ) 就是单⽬操作符的。

7.1++

++分为前置++和后置++
区别:后置++是先让变量被使用后再加
           前置++是让变量加了后再使用

7.2--

--和++类似都分前置和后置,区别和++一样

7.3+ 和 -

+和-都是用来表示值的正负号

8.强制类型转化

在操作符中还有⼀种特殊的操作符是强制类型转换,语法形式很简单,形式如下:
1.( 类型 )
请看代码:
int a = 3.14 ;
//a 的是 int 类型 , 3.14 double 类型,两边的类型不⼀致,编译器会报警告

为了消除这个警告,我们可以使⽤强制类型转换:

int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分  

9.scanf和printf介绍 

   9.1.printf

     9.1.1基本用法

printf() 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以
定制输出⽂本的格式。
注意 :printf不会在行尾自动添加换行符,要想光标移到下一行的开头,可以通过添加一个换行符\n实现。
# include <stdio.h>
int main ( void )
{
printf ( "Hello World\n" );
return 0 ;
}
​​​​​​​

如果⽂本内部有换⾏,也是通过插⼊换⾏符来实现,如下⽅代码:

 

# include <stdio.h>
int main ( void )
{
printf ( "Hello\nWorld\n" );
printf ( "Hello\n" );
printf ( "World\n" );
return 0 ;
}​​​​​​​
printf() 是在标准库的头⽂件 stdio.h 定义的。使⽤这个函数之前,必须在源码⽂件头部引⼊这
个头⽂件。

 9.1.2占位符

printf() 可以在输出⽂本中指定占位符。
所谓 “占位符”,就是这个位置可以⽤其他值代⼊。
如下:
// 输出 There are 3 apples
# include <stdio.h>
int main ()
{
printf ( "There are %d apples\n" , 3 );
return 0 ;
}
There are %d apples\n 是输出⽂本,⾥⾯的 %d 就是占位符,表⽰这个位置要
⽤其他值来替换。占位符的第⼀个字符⼀律为百分号 % ,第⼆个字符表⽰占位符的类型, %d 表⽰这⾥代⼊的值必须是⼀个整数。
除了整数还有字符串等,以及多个占位符的形式。

9.1.3占位符列举

以下为常用的占位符:

%c :字符。 ​​​​​​​

%d :⼗进制整数。

%f :⼩数(包含 float 类型和 double 类型)。

%n :已输出的字符串数量。该占位符本⾝不输出,只将值存储在指定变量之中。

%p :指针。

%s :字符串。

%u :⽆符号整数(unsigned int)。

%zd size_t 类型。

%% :输出⼀个百分号。

9.1.4输出格式

printf() 可以定制占位符的输出格式。

9.1.4.1限定宽度

printf() 允许限定占位符的最⼩宽度。

# include <stdio.h>
int main ()
{
printf ( "%5d\n" , 123 ); // 输出为 "  123"
return 0 ;
}
上⾯⽰例中, %5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。 输出的值默认是右对⻬,即输出内容前⾯会有空格;如果希望改成左对⻬,在输出内容后⾯添加空格,可以在占位符的 % 的后⾯插⼊⼀个 - 号。
​​​​​​​
# include <stdio.h>
int main ()
{
printf ( "%-5d\n" , 123 ); // 输出为 "123 "
return 0 ;
}

对于⼩数,这个限定符会限制所有数字的最⼩显⽰宽度。 

// 输出 " 123.450000"
# include <stdio.h>
int main ()
{
printf ( "%12f\n" , 123.45 );
return 0 ;
}
上⾯⽰例中, %12f 表⽰输出的浮点数最少要占据12位。由于⼩数的默认显⽰精度是⼩数点后6位,所以 123.45 输出结果的头部会添加2个空格。

 9.1.4.2正负号

默认情况下, printf() 不对正数显⽰ + 号,只对负数显⽰ - 号。如果想让正数也输出 + 号,可
以在占位符的 % 后⾯加⼀个 +

9.1.4.3限定小数位数

输出⼩数时,有时希望限定⼩数的位数。举例来说,希望⼩数点后⾯只保留两位,占位符可以写
%.2f
// 输出为 " 0.50"
# include <stdio.h>
int main ()
{
printf ( "%6.2f\n" , 0.5 );
return 0 ;
} 
上⾯⽰例中, %6.2f 表⽰输出字符串最⼩宽度为6,⼩数位数为2。所以,输出字符串的头部有两个空格。

 最⼩宽度和⼩数位数这两个限定值,都可以⽤ * 代替,通过 printf() 的参数传⼊。

# include <stdio.h>
int main ()
{
printf ( "%*.*f\n" , 6 , 2 , 0.5 );
return 0 ;
}
// 等同于 printf("%6.2f\n", 0.5)

9.2scanf

当我们有了变量,我们需要给变量输⼊值就可以使⽤ scanf 函数,如果需要将变量的值输出在屏幕上的时候可以使⽤ prinf 函数。

9.2.1 基本用法

scanf()函数用于读取用户的键盘输入。

  scanf("%d", &i);

上⾯⽰例中, scanf() 的第⼀个参数 %d ,表⽰⽤⼾输⼊的应该是⼀个整数。 %d 就是⼀个占位
符, % 是占位符的标志, d 表⽰整数。第⼆个参数 &i 表⽰,将⽤⼾从键盘输⼊的整数存⼊变量
i

 

注意 :变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,
即将变量 i 的地址指向⽤⼾输⼊的值。
如果这⾥的变量是指针变量(⽐如字符串变量),那就不⽤加 & 运算符

9.2.2scanf的返回值

scanf() 的返回值是⼀个整数,表⽰成功读取的变量个数。
如果没有读取任何项,或者匹配失败,则返回 0 。如果在成功读取任何数据之前,发⽣了读取错误或者遇到读取到⽂件结尾,则返回常量 EOF。

9.2.3赋值忽略操作符

有时,⽤⼾的输⼊可能不符合预定的格式。

# include <stdio.h>
int main ()
{
int year = 0 ;
int month = 0 ;
int day = 0 ;
scanf ( "%d-%d-%d" , &year, &month, &day);
printf ( "%d %d %d\n" , year, month, day);
return 0 ;
​​​​​​​}
上⾯⽰例中,如果⽤⼾输⼊ 2020-01-01 ,就会正确解读出年、⽉、⽇。问题是⽤⼾可能输⼊其他
格式,⽐如 2020/01/01 ,这种情况下, scanf() 解析数据就会失败。
为了避免这种情况, scanf() 提供了⼀个赋值忽略符(assignment suppression character) *
只要把 * 加在任何占位符的百分号后⾯,该占位符就不会返回值,解析后将被丢弃。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值