C语言的数据类型与变量

本文详细介绍了C语言中空语句的使用、数据类型(包括浮点型、布尔类型以及不同数据类型的长度)、sizeof操作符、signed和unsigned的区别、变量的初始化和赋值,以及printf和scanf的占位符、宽度限定和特殊功能。
摘要由CSDN通过智能技术生成

一:空语句的使用 

   空语句使用的情况是这里需要一条语句,但语句又不用执行任何事情。

#include <stdio.h>
int main()
{
 ;//空语句
 return 0;
}


二:数据类型

一:浮点型


  folat,double,long double,属于浮点型。double比float更精确。

float对应的占位符为%f,double对应的占位符为%ld。

  使用浮点型示例:

int main(){
float a = 0.2f;
float b = 0.2;
return 0;
}

  第一个浮点型需要加上f是因为,定义float型是时默认结果为double类型,因此加上f,则结果为float类型。浮点型打印出的结果的形式默认为小数点后六位。

二:布尔类型(_Bool或bool)


  C 语言原来并没有为布尔值单独设置⼀个类型,而是使用整数 0 表示 假,非零值表示真。
在 C99 中也引入了布尔类型 ,是专门表示真假的。使用布尔类型时,需要调用其库函数<stdbool.h>
示例:

#include <stdio.h>
#include<stdbool.h>
int main()
{
	bool a = true;
	if (a) //如果正确
	{
		printf("hehe/n");
	}
}

  值得一提的是,即便如此,0仍然代表假,非0数代表真。

影响如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
    int a = 0;
    while (scanf("%d", &a) != EOF) {
        if (a = 0) {
            printf("hehe");
        }
        else {
            printf("haha");
        }
    }
    return 0;
}

无论输入什么数字,其结果都为haha。原因:首先,if语句的条件是赋值(=),而不是判断(==)。因此无论输入什么数字,其最后都为0。于是语句if(a = 0)等价于语句if(0),就代表假,那么就不应该读取假里面的内容,应该读取else里的内容。

若将0换成1,那么结果相反,无论输入什么数,都打印hehe。因为输入的数都会变成1,非0数都为真,那么应该直接执行真里面的语句。


三:各种数据类型的长度


  每⼀种数据类型都有自己的长度,使用不同的数据类型,能够创建出长度不同的变量,变量长度的不同,存储的数据范围就有所差异。


一:sizeof操作符


  sizeof 是用来计算sizeof的操作符数的类型长度的,单位是字节(byte)。

  sizeof 操作符的操作数可以是类型,也可是变量或者表达式。 sizeof (类型)或sizeof 表达式。注意,其中的表达式不会被计算出。

  sizeof 的计算结果是 size_t 类型的。因为sizeof返回的类型可能为signed,也可能为unsigned,而unsigned对应printf()的占位符为%u(unsigned int)、%lu(unsigned long)、%llu(unsigned long long)。因此,为了统一,使用占位符%zd。 unsigned见下文signed与unsigned。

#include<stdio.h>
int main()
{
printf("%zd\n",sizeof(int));
return 0;
}


拓展:计算中的单位
1:bit  比特位    刚好储存一个二进制位空间

2:Byte  字节  1Byte = 8bit

3:KB   1KB = 1024(2的10次方)Byte

4:MB   1MB = 1024 KB

5:GB   1GB = 1024 MB

……

二:signed 与 unsigned


  signed与unsigned关键字是用于修饰字符型与整数型的。signed表示结果可正可负,unsigned表示结果只为非负数。

  int = signed int 但是chat != signed chat

  整数变量声明为 unsigned 的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。

四:变量

  变量在创建的时候就给⼀个初始值,就叫初始化。 在变量创建好后,再给一个值,这叫赋值。一般情况下,初始化过程最好不要省略。

#include<stdio.h>
int main()
{
 int a = 0;//初始化
 a = 10;//赋值
 printf("%d\n",a);
 return 0;
}


  五:算数操作符


  需要注意的是运算符 /,除号的运算。如果除号前后都是整数,那么输出的结果也是整数(例7/2结果为3)。若需要得到浮点型结果,那么除号前后两部分至少有一部分是小数。

  运算符 % 表示求模(余)运算,即返回两个整数相除的余值。这个运算符只能用于整数,不能用于浮点数。负数求模的规则是,结果的正负号由第一个运算数的正负号决定。

#include <stdio.h>
int main()
{
 printf("%d\n", 11 % -5); // 1
 printf("%d\n",-11 % -5); // -1
 printf("%d\n",-11 % 5); // -1
 return 0;
}


六:单目操作符(只有一个操作数):++、--、+、-


    一:前置++

int a = 10;
int b = ++a;//++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);


计算口诀:先+1,后使用;
 
  a原来是10,先+1,后a变成了11,再使用就是赋值给b,b得到的也是11,所以计算后, a和b都是11 。


   二:后置++

int a = 10;
int b = a++;//++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);


计算口诀:先计算,后+1;

a原来是10,先给b赋值,b就等于10,然后再+1,a就等于11。所以计算后,a = 11,b ==10。

七:强制类型转换

int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告


为了消除这个警告,我们可以使用强制类型转换:
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分,不到特不得已,最好不使用强制类型转换,使其自然运行。


八:printf与scanf

一:占位符

占位符,就是这个位置可以用其他值来带入。

#define _CRT_SECURE_NO_WARNINGS 1​
#include<stdio.h>
int main() {
	int a = 0;
	printf("%d与%d相等,都为0", a );//误认为一个a可以直接带入两个%d
	return 0;
}

执行结果

printf()与scanf()中的占位符的数量应当比其中的参数少一,不可多于也不可少于。与第一个参数后的参数一一对应。

错误示范:

#define _CRT_SECURE_NO_WARNINGS 1​
#include<stdio.h>
int main() {
	int a = 0;
	printf("%d与%d相等,都为0",a)//误认为一个a可以带入两个%d
	return 0;
}


​

二:限定宽度

一:printf()允许限定最小宽度
#include<stdio.h>
int main(){
printf("%5d",123);//%5d代表打印的数至少为5个,不足部分用空格替代,且向右对齐
return 0;         //若超过5个,则不管
}

结果为  123。

二:限定小数数位
#include <stdio.h>
int main()
{
 printf("Number is %.2f\n", 0.5);//%.2代表输出结果保留小数点后2位,结果四舍五入
 return 0;
}
三:*号代替

以上两种可以同时使用。

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

三:输出部分字符串

// 输出 hello
#include <stdio.h>
int main()
{
 printf("%.5s\n", "hello world");
 return 0;
}

四:scanf

当读取到scanf时,程序会停下,等待用户从键盘输入。

变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,而是地址,
即将变量 i 的地址指向用户输入的值。
如果这里的变量是指针变量(⽐如字符串变量),那就不用加 & 运算符。
一:scanf的返回值
  1:scanf的返回值为整数,代表成功读取的个数。
  2:如果没有读取任何项,或者匹配失败,则返回 0
  3:如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
  4:在VS环境中,按三次ctrl+z加上回车等于直接结束scanf读取 。返回EOF(-1)。
 二:scanf的特殊储存
1:除了 %c 以外,都会自动忽略起首的空白字符。 %c 不忽略空白字符,总是返 回当前第⼀个字符,无论该字符是否为空格。若要强制跳过空格,则应该写scanf(" %c".&a),即%c前加空格。
2:当scanf储存%s字符串时,读取规则为,从第一个非空格开始读取,一遇到空格、换行符等就停止读取,因此读取的一个字符串类中间不应有空格等,若有需要,则储存多个%s。

  此外scanf储存%s时,应该设定读取字符串的长度,否则若超出预定长度虽然会读取,但会报错。

三:赋值忽略符
#include<stdio.h>
int main(){
char arr[5];//[]中的5是预定字符串arr中长度最多为5,而且字符串后自带一个\0
scanf("$4s",arr);//由于scanf没有自动识别长度的功能,所以需要设置%4s,即只读取4个字符 
return 0;        //如果不设置,当用户输入字符串abcde时,会报错
}

​
//为了忽略这个影响,我们需加入%*
#include<stdio.h>
int main(){
int a = 0;
int b = 0;
scanf("%a%*%b",&a.&b);//无论用户输入1,2还是1.2
printf("%a %b",a,b);//最后结果都是1 2
return 0;
}

  • 41
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值