c语言中数据类型和变量

简介: c语言中数据类型和变量

数据类型介绍

数据类型分为:内置类型和自定义类型

内置类型

char   //character字符
[signed] char   //有符号的
unsigned char   //无符号的   
short --短整型//shortr [int]  int可以省略
int --整型
long --长整型
long long --更长的整型
float --单精度浮点型
double --双精度浮点型
表示真/假的变量Bool 
布尔类型的使用需要包含头文件<stdbool.h>
布尔变量的取值是:ture  false,0表示假,非0表示真

数据类型长度(sizeof)

#include <stdio.h>
int main()
{
 
    printf("%zd\n",sizeof(float));
 
 
    return 0;
}
 
 
 
 
 
#include <stdio.h>
int main()
{
    int a = 10;
    printf("%zd\n",sizeof (a));
 
 
    return 0;
}
输出结果我为4,因为a=10,而10是整型,整型的长度为4
 
 
 
zizeof后面的括号里面如果放的是表达式,表达式不会真实计算
 
 
 
#include <stdio.h>
int main()
{
    short s = 2;
    int b = 10;
    printf("%zd\n",sizeof (s = b + 1));
    printf("s = %d\n",s);
 
    return 0;
}
输出结果是:2
         s = 2
对于第37行,b是整型,1也是整型,所以b+1的结果也是整型,但是代码要求打印所以一切根据s来说,,s是一个short类型,长度为2,所以代码输出结果为2,37行的表达式是不会真实计算的

c语言标准规定:sizeof(long)≥sizeof(int)

signed和unsigned

signed关键字,表示一个类型带有正负号,包含负值

unsiged关键字,表示该类型不带有正负号,只能表示0和正整数

signed int unm = 100;//signed int --有符号的int
unsigned int = 100;//无符号的int

char是否有符号取决于编译器的实现,大部分的编译器上 char = signed char

int = signed int -----有符号的int

以后在编程中要写无符号的int,就写unsigned int

//对于有符号的整数打印应该使用%d,即带有负号的
//对于无符号的整数打印应该使用%u
#include <stdio.h>
int main()
{
 
    int num = -100;
    printf("%d\n",num);
 
 
    return 0;
}

涉及到有数字的打印,我们应该考虑数字的符号问题,是否带有正负号

除法/

除号的两端如果是整数,执行的是整数除法,得到的结果也是整数

#include <stdio.h>
int main()
{
    printf("%d\n", 10 / 4);
 
 
 
    return 0;
}
运行结果是2
 
只要有一个数是小数,则程序执行的就是小数除法
#include <stdio.h>
int main()
{
    printf("%f\n", 10 / 4.0);
 
 
 
    return 0;
}
 
运算结果为2.500000
,一定要将%d换成%f,不然会报错

取余%

运算符%表示取余,即返回两个整数相除的余值,这个运算符只能用于整数,不能用于浮点数

#include <stdio.h>
int main()
{
    printf("%d\n", 9 % 4);
 
 
 
    return 0;
}
 
结果为1
#include <stdio.h>
int main()
{
    printf("%d\n", 11 % -5);
    printf("%d\n", -11 % -5);
    printf("%d\n", -11 % 5);
 
    return 0;
}
 
结果为1  -1  -1
 
原因:负数取余的规则是,结果的正负号是由第一个运算数的正负号决定的

 

负数取余的规则:负数取余的规则是,结果的正负号是由第一个运算数的正负号决定的

除号两边只要有一个是小数,就执行小数除法 ,%操作符的操作数只能是整数

%操作符计算的结果是两个操作数整除之后的余数

单目操作符:++、--、+、-连续赋值和复合赋值

int a = 3;
int b = 5;
int c = 0;
c = b = a + ;3 //连续赋值,从左到右依次赋值的 
 
  更方便的一种复制方法:
int a = 3;
int b = 5;
int c = 0;
b = a + 3;
c = b;
int a = 0;//初始化
a = a + 10;
a += 10;//复合赋值

前置++

int a = 5;
int b = ++a;//先++,后使用,a=a+1,b=a

后置++

int a = 5;
int b = a++;//先将a带入b中,再++,b=a,a=a+1
 
 
#include <stdio.h>
int main()
{
    int a = 10;
    int b = a--;
    printf("a = %d\n",a);//a=9
    printf("b = %d\n",b);//b=10
    return 0; 
}
 
 
 
前置--
#include <stdio.h>
int main()
{
    int a = 10;
    int b = --a;先减一再带入到b
    printf("a = %d\n",a);//a=9
    printf("b = %d\n",b);//b=9
    return 0; 
}
 
 
 
#include <stdio.h>
int main()
{
 
    int a = 5;
    printf("%d\n",a--);//5
    printf("%d\n",a);//4
    return 0;
}
 
 
 
 
 
题目:
#include <stdio.h>
int main()
{
    int a, b, c;
    a = 5;
    c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6  c = 6
    b = ++c, c++, ++a, a++;
   // 这里先算b=++c, b得到的是++c后的结果,b是7
   // b=++c 和后边的整体构成逗号表达式,依次从左向右计算的。
   // 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7
    b += a++ + c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9
    printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8
    return 0;
 
 
 
  ++a,a先加,再带入到c
 
b=++c,c++,++a,a++
 依次执行
 先++c,然后c=7,再带入到b,b=7   
 c++是单独的,c=8
 ++a,a+1=7
a++.单独计算,a+1=8
 
 
 
 
b += a++ +c
对其展开:
原式=b = b+(a++ +c)//该式子未改变c,所以c仍然为8
b=7+(a++ +c),因为此处的a++是后置a++,所以先取a的值,再++
b=7+(a+8);a++
 b=7+(8+8)a++ 
 再执行a++,前面a++是8,所以此处为a=9
    b=7+16=23

 

b=++a,就是先a+1,再把+1后的结果带到b里面

a先带进去,再自己+, 先带后加

int b = a++ //先把a的值赋值到b上面,再a自己+1,b就不参与了,因为已经被a 赋值了,

a先+上,再带进去,先+后带

int b =++a //先a自己+1进行计算,再把计算后的a带入到b的值里面

强制类型转换

 

#include <stdio.h>
int main()
{
    int a =(int)3.14;//3.14属于double类型,在前面添加括号int 即可实现强制转换
    printf("%d\n",a);
 
 
    return 0;
}

实现强制类型转换是万不得已的情况下使用

scanf和printf介绍

 

printf=printf+format,按照一个格式来打印,

除了%c以外,都会自动忽略起首的空白字符,

scanf的占位符遇到空格会停止读取的

printf("%d\n",100);     //这其中的%d就是占位符
printf("There are %d apple\n",3);
printf("%s says it is %d o'clock","kai",10); 
 
printf()有n个占位符就应该有n+1个参数,拿第三行举例,"kai"和10算两个参数,对于printf(),"%s says it is %d o'clock"也算一个参数。
 
printf("%5d\n",11234)//  %5d调整数据的长度
%5d这个占位符的宽度至少为5位如果不满5位,对应的前面会添加空格,如果满足5位甚至大于5位,则原样输出
 
 
 
%f
%lf 在打印时,小数点后默认6位
 
#include <stdio.h>
int main()
{
 
    printf("%-5d\n",123);//在%和d中间添加-n可以让输出结果在位数不够凑的情况下,补足输出结果前面的空格
 
 
    return 0;
}
 
 
总是显示正负号:在%d之间加上+号
 
若要让输出结果显示正负号,需要在%和d之间添加+号,仅仅在后面的数字前面加+号是不会显示的
#include <stdio.h>
int main()
{
 
    printf("%+d\n",123);
    printf("%d\n",-123);
 
    return 0;
}
 
 
printf("%5.5f\n",+123.4);//调整小数点后面的位数
 
 
printf("%*.*f\n",6,5,1.526);//通过*号和参数的配合,让*号给后面的数据占位
 
printf("%.3s\n","abcdef");//若想要使输出字符串控制在前三位,只打印前三位,在%和s之间输入.n即可调整打印的位数
#include <stdio.h>
int main()
{
    int score = 0;//输入score这个容器,现在是容量是0
    printf("请输入成绩:");    //引导我们输入值
    scanf("%d",&score);     //输入的值导入到score中,score的含量变为你输入的值的大小,&符号是取地址的符号,取score这个地址
    printf("成绩是:%d\n",score);   再将score中的值打印出来
 
 
 
    return 0;
}
程序运行到scanf时就停下来,等待用户输入数值,输完数据才能往下走
 
 
scanf()的第一个参数是格式化占位符,基本占位跟printf一样
scanf("%d",&i),告诉编译器如何解读用户的输入,需要提取的数据是什么类型
因为c语言是有格式类型的,sanf必须提前知道用户输入的数据类型,才能处理数据
 
scanf()函数中一定要添加&去取地址
 
 
#include <stdio.h>
int main()
{
    int a = 0;
    int b = 0;
    float c = 0.0;
    float d = 0.0;
    scanf_s("%d %d %f %f", &a,&b,&c,&d);
    printf("%d %d %f %f", a,b,c,d);
 
 
    return 0;
}
在scanf()中一定要添加取地址符号&,不然不能将数据存储在变量中
 
scanf()在处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符
 
查询返回值:
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int ret = scanf("%d %d %d %d", &a, &b, &c, &d);
printf("a=%d b=%d c=%d d=%d\n", a, b, c, d);
printf("ret=%d\n", ret);
return 
 
 
 
 
  除了%c以外,都会自动忽略起首的空白字符,     
 
 
  强制跳过空白字符
  如果在%c前面加空格,则会主动跳过你输入的空格信息,然后直接读取真正的字符
  scanf(" %c",&i)
 
 
 
  char ch = 0;
scanf_s(" %c", &ch);
printf("xxxx%cyyyy\n", ch);
vs提示:scanf函数不安全,考虑用scanf_s来替换
scanf和scanf_s的使用方法不完全相同
如果让错误信息失效的话,请使用_CRT_SECURE_NO_WARNINGS
要用#define定义这个函数
#define _CRT_SECURE_NO_WARNINGS 1,
使用everything搜索newc++

赋值忽略符:为了避免你给的格式和scanf中的格式是不一样而导致结果出错,赋值忽略符起到作用

只要把*号加在任意占位符的百分号后面,该符号就不会返回值,解析后将被丢弃

int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day)
  输入2024-5-14
  输出2024 5 14
 
  若输入2024/5/16  则输出2024 0 0,则数据就错了
 
将第4行改成以下:
scanf("%d%*c%d%*c%d", &year, &month, &day);
在%d与%d之间添加%*c,这里的%*c就是赋值忽略符
输入2024/5/15 输出2024 5 15
  斜杠就被忽略掉了,斜杠算一个字符,与%c配对,在配对后会被省略
只要数值给对了,格式都无所谓的


相关文章
|
1月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
22天前
|
存储 编译器 C语言
【C语言】C语言的变量和声明系统性讲解
在C语言中,声明和定义是两个关键概念,分别用于告知编译器变量或函数的存在(声明)和实际创建及分配内存(定义)。声明可以多次出现,而定义只能有一次。声明通常位于头文件中,定义则在源文件中。通过合理组织头文件和源文件,可以提高代码的模块化和可维护性。示例包括全局变量、局部变量、函数、结构体、联合体、数组、字符串、枚举和指针的声明与定义。
46 12
|
1月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
46 8
|
1月前
|
C语言
【C语言】全局搜索变量却找不到定义?原来是因为宏!
使用条件编译和 `extern` 来管理全局变量的定义和声明是一种有效的技术,但应谨慎使用。在可能的情况下,应该优先考虑使用局部变量、函数参数和返回值、静态变量或者更高级的封装技术(如结构体和类)来减少全局变量的使用。
36 5
|
3月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
58 1
|
3月前
|
存储 C语言
C语言指针与指针变量的区别指针
指针是C语言中的重要概念,用于存储内存地址。指针变量是一种特殊的变量,用于存放其他变量的内存地址,通过指针可以间接访问和修改该变量的值。指针与指针变量的主要区别在于:指针是一个泛指的概念,而指针变量是具体的实现形式。
|
3月前
|
存储 C语言
C语言:设置地址为 0x67a9 的整型变量的值为 0xaa66
在C语言中,可以通过指针操作来实现对特定地址的访问和赋值。要将地址为 0x67a9 的整型变量值设为 0xaa66,可以先定义一个指向该地址的指针,并通过该指针对该内存位置进行赋值操作。需要注意的是,直接操作内存地址具有一定风险,必须确保地址合法且可写。代码示例应考虑字节序及内存对齐问题。
|
3月前
|
C语言 C++
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
【C语言】指针篇-一篇搞定不同类型指针变量-必读指南(3/5)
|
3月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
3月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
30 0