C语言基础知识:常量、变量、表达式、判断、分支、循环、数据类型

常量、变量、表达式、判断、分支、循环、数据类型

1.变量定义

int price;
int price=10,amout=20;

注意:ANSIC只能在开头的地方定义变量,而C99可在任意地方。

2.常量

const int AMOUNT = 100;
修饰符const表示常量,只能初始化。

3.基础类型

整数:char,short,int,long,(C99: long long)
浮点数:float,double,(C99: long double)
逻辑:(C99: bool)
指针
自定义类型

表达的数的范围:char < short < int < float < double
整数类型在内存中为二进制数(补码),浮点数为编码。(编码不可以直接拿来做运算)
int和long的字节取决于编译器(CPU)

4.sizeof

sizeof是一个运算符,可以给出某个类型或变量在内存中占据的字节数。
`printf("res=%ld",sizeof(int));  sizeof(long)  sizeof(double)  sizeof(a)`

5.补码

我们希望-1 + 1 -> 0。如何做到?
	0 -> 00000000
	1 -> 00000001
	11111111 + 00000001 -> 100000000
因为0 - 1 -> -1,所以:
	-1 = (1)00000000 - 00000001 -> 11111111
当11111111被当作纯二进制看待时是255,被当作补码时是-1。
同理:对于-a,其补码是0-a,实际是2^n-a,n是这种类型的位数。

对于一个字节(8位),可以表达00000000~11111111
其中 00000000 -> 0
11111111 ~ 10000000 -> -1 ~ -128
00000001 ~ 01111111 -> 1 ~ 127

6.unsigned

在常量后加u或U,表示为unsigned。 (用l或L表示Long)
unsigned的初衷并非扩展数能表达的范围(这是附带的副作用),
而是为了做纯二进制运算,主要是为了移位。

将它们看成一个圆,
补码:0-1=-1,-1+1=0,但是127+1=(-128),(-128)-1=127
补码:0,……,100,……,127,-128,……,-100,-1,0
unsigned:0-1=255,255+1=0

	unsigned char co = 255;	 //不表达负数(补码)
	char c = 255;	//补码
	int i = 255;	//二进制
	printf("c=%d, i=%d\n", c, i);
	//c=-1, i=255

7.探究最大数

//找出int类型最大的数
#include <stdio.h>
int main()
{
	int a=0, b=0;
	while(++a > 0)
	{
		b = a;
	}
	printf("big int : %d\n", b);
	
	int i = 1;
	while((b=b/10) != 0)
	{
		i++;
	}
	printf("max num of digits : %d\n", i);
	return 0;
}
//找出unsigned类型最大的数
#include <stdio.h>
int main()
{
	int a = 0;
	while(a > 0){
		a++;
	}
	printf("big unsigned : %u", a-1);	
	return 0;
}

8.整数的格式化

  • 只有两种形式:int或long long`
  • %d : int
  • %u : unsigned
  • %ld : long long
  • %lu : unsigned long long
    • scanf要输入short时需要%hd.

进制:bin、oct、dec、hex
printf(“value hex into oct : %o”,0x12);

9.浮点的输入输出

类型scanfprintf
float%f%f,%e
double%lf%f,%e
  • %e 输出科学记数法

    • double ff = 123.4567;
    • printf("%e, %f\n",ff,ff);
      • 1.234567e+002, 123.456700
  • %.nf 指定输出小数点后n位(四舍五入)

    • printf("%.3f \n", -0.0078);
    • printf("%.30f \n", -0.0078);
    • printf("%.3f \n", -0.00078);
    • printf("%.3f \n", -0.00024);
      • -0.008
      • -0.007799999999999999600000000000
      • -0.001
      • -0.000
  • inf表示无穷大、nan表示不存在

    • 只应用于浮点数
    • printf("%f\n", 12.0/0.0)
    • printf("%f\n", -12.0/0.0)
    • printf("%f\n", 0.0/0.0)
      • inf
      • -inf
      • nan

10.字符的输入输出

|类型|符号|
|:---:|:---:|
|char|%c|
|int|%d|
  • 一个字符加一个数得到ASCII码表中那个数后的字符

    char c = 'a';
    c += 2;
    printf("%c\n",c);   //c
    
  • 两个字符的减,得到它们在码表中的距离

    int i = 'z' - 'a';
    printf("%d \n",i);  //25
    
  • a+‘a’-‘A’ 可以将大写字母变为小写;

  • a+‘A’-‘a’ 可以将小写字母变为大写。

11.逃逸字符

字符意义字符意义
\b回退一格"双引号
\t到下一个表格位单引号
\n换行\反斜杠本身
\r回车
printf("abc")		abc
printf("abc\bh")	abh

12.逻辑类型

`#include <stdbool.h>` 导入之后即可使用bool、true、false
使用%d输出为1即是true。

13.逻辑运算

运算符描述示例结果
!逻辑非!a若a是true则结果为false
&&逻辑与a&&b若a和b都是true则结果是true、
否则是false
||逻辑或a||b若a和b有一个是true则结果是true,
两个都是false则结果是false
  • 如何表达数学中的区间?

    • x∈[2,6] ==> x>=2&&x<=6
  • 判断字符c是否为大写字母?

    • c >= ‘A’ && c <= ‘Z’
  • 理解 !age<20 ?

    • 因为感叹号是和age结合在一起的,所以age如果是0,则变为1;
    • 如果不是0,则变为0;无论是0还是1都是小于20的,所以结果一直为true。
  • 逻辑符号的优先级

    • ! > && > ||

14.优先级:

优先级运算符结合性
1()从左到右
2! + - ++ –从右到左(单目+和-)
3* / %从左到右
4+ -从左到右
5< <= > >=从左到右
6== !=从左到右
7&&从左到右
8||从左到右
9= += -= *= /= %=从右到左

15.条件运算符

count = (count>20) ? count-10 : count+10
	如果count大于20则将其减10后赋给count,否则将其加10赋给count。
  • 优先级
    • m < n ? x : a+5
    • a++ >= 1 && b-- <= 4 ? a : b
    • x=3*5 > 5 ? 5 : 20

16.逗号运算符

逗号用来连接两个表达式,并以其右边的表达式的值作为
它的结果。    逗号的优先级是所有的运算符中最低的,
所以它两边的表达式会先计算。

目前只有一种用法,在for中使用:
	for(i=0,j=10;i<j;i++,j--)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hao难懂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值