C语言学习之数据

查漏补缺:

复制文件 cp

用到#include<math.h> 编译时加参数 -lm

共享文件夹路径: /mnt/hgfs/share/

编译步骤:

1.预处理 展开#开头代码(头文件,宏定义,条件编译)

2.编译 语法检查与把C代码翻译成汇编代码

3.汇编 把汇编语言编译成二进制文件

4.链接 链接程序需要用到的文件

今日学习:

1、基本数据类型

2、运算符与表达式

3、控制结构

4、循环语句

C语言效率较高->指针可以操作内存

* 指针 传地址

基本数据类型 空类型

字符型

数值型 实型 单精度

双精度

整型 短整型 无符号

有符号

整型 无符号

有符号

长整型 无符号

有符号

★整型不一定比短整型长

32位操作系统

整型int short :

整数, 4个字节 2个字节

单精度实型float

单精度浮点数,一般4个字节

双精度实型double

双精度浮点数,一般8个字节

字符型char

1个字节

内存单位:字节 8位

利用关键字sizeof查看数据占得字节数 一共32个关键字

short

范围 -32768~32767

unsigned short

范围 0~65535

字符型char

范围 -128~127 1个字节 8位

最大 01111111 2^7-1=127

00000000 0

11111111 -(2^7-1)=-127

最小 10000000 -128

unsigned char

范围 0~255 1个字节 8位

最大 11111111 2^8-1=255

最小 00000000 0

float

范围 3.4e-38~3.4e38

32位 1位符号位 23位尾数位 8位指数位 尾数位的值*10^指数位的值

字符是有符号整数

strlen() 库函数 求长度 #include<string.h>

\0 字符串结束标志 \ 转义字符

strlen 遇到 '\0'结束 <--或0结束--|

字符串后面默认有'\0' |

字符在内存中以ASCII形式存储 |

'a' 97 '0' 60 '\0' 0 即-|

%d 输出有符号整型

%u 输出无符号整型

#include<stdio.h>
#include<string.h>
int main()
{
   	 char a[1000];
    	int i=-20;
    
   	 for(i=0;i<1000;i++)
    	{
        a[i]=-1-i;
//      printf("%d ",a[i]);
   	 }
//  printf("\n");
    printf("a changdu = %d\n",strlen(a));
    
    return 0;
}

不同类型做运算

#include<stdio.h>
int main()
{
    	unsigned int j=10;
   	unsigned int c=3;

    	printf("i + j = %d\n",i+j);
    	printf("i + j = %u\n",i+j);
   	printf("c * 3 = %u\n",c * (-1));

    	return 0;
}

int a; char b; a+b

11111111111111111111111111111111 int 表示的范围大

11111111 char

所以运算时补零,将 char 转换成 int 即:

00000000000000000000000011111111 int

混合运算:转换成能表示范围更大的类型

无符号类型比有符号类型范围大,其从零开始,能表示的个数一样,所以范围大

负数以补码的形式存储,如-20

10000000 00000000 00000000 00010100

11111111 11111111 11111111 11111111 反码

11111111 11111111 11111111 11101100 补码(反码加一)

const修饰只读变量

const int a; 不能通过变量a修改对应内存的值

#地址 取第一个元素的地址

#include<stdio.h>
int main()
{
    const int a=1;
    int *p = (int *)&a;		//用到了强制类型转换(cast)
    *p = 3;
    printf("a = %d\n",a);	//可以通过指针修改a对应内存的值
      
    return 0;
}

暂时不需要了解

const int *p; (*p)++;不合法

int * const q; q++;不合法

const int * const z; (*z)++;z++;都不合法

volatile防止编译时被优化

C的运算符有以下几类:

(1)算术运算符 (+ - * / %)

(2)关系运算符 (> < == >= <= !=) //尽量将(a == 0),写成(0 == a)

(3)逻辑运算符 (! && ||)

(4)位运算符 (<< >> ~ | ∧ &)

(5)赋值运算符 (=及其扩展赋值运算符)

(6)条件运算符 (?:) //又称三目运算符(有几个参数就是几目)

(7)逗号运算符 (,) //表达式1,表达式2 先求解表达式1,再求解表达式2,输出的是表达式2的值

(8)指针运算符 (*和&)

(9)求字节数运算符(sizeof)

(10)强制类型转换运算符( (类型) )

(11)分量运算符(.->)

(12)下标运算符([ ])

(13)其他 (如函数调用运算符())

函数符号() 数组下标[] ↑

单目运算符 |

算数运算符 |优

移位运算符 |先

关系运算符 |级

逻辑运算符 |

三目运算符 |

\n 换行 \t水平制表

'a'一个字符 "a\0"两个字节 创建数组时候创的大一点

gcc参数 -Wall 打开所有警告

g++ 编译命令c++

请编写一个c函数,该函数给出一个字节中被置为1的位的个数

#include<stdio.h>
int main()
{
   	char ch,i,count=0;

    	printf("Please input a char: \n");
   	scanf("%c",&ch);

    for(i=0;i<8;i++)
 	   {
        if(ch & 1 == 1)
        { 
            count++;
        }
        ch = ch >> 1;
    }
    printf("%d\n", count);

    return 0;
}

输出结果:a b c

                  3 3 4 //输入a,输出3,再执行一次输入b,..,这么写结果只是为了更直观看

i++与++i的区别:

++i是先执行i=i+1后,再使用i的值;

i++是先使用i的值后,再执行i=i+1。

int a = 4; //默认每条语句a = 4,输出a的值

a+=a++; a = 9 |a=4+4+1

a+=++a; a = 10 |a=5+5

++a+=a; a = 10 |a=5+5

++a+=a++; a = 11 |a=5+5+1

++a+=++a; a = 12 |a=6+6

运算时候有 a++ 先不管++

++a 直接算出a

条件运算符与逗号运算符

#include<stdio.h>
int main()
{
    int num1, num2, max, min, i=1;
    printf("Please input two numbers: \n");
    scanf("%d%d",&num1,&num2);
    
    max = (num1>num2)? num1: num2;			//括号里判断,成立输出第一个,否则输出第二个
    min = (num1<num2)? num1: num2;
    
    printf("max = %d\tmin = %d\n", max, min);
    
    printf("first i++,i = %d\n", i++);		//输出:1
    printf("second ++i,i = %d\n", ++i);		//输出:3

    i=1;
    printf("i= %d\n",i);

    printf("first ++i = %d\n", ++i);		//输出:2
    	printf("second i++ = %d\n", i++);	    //输出:2

    return 0;
}

分析一个程序

每条语句用分号“;”结束。

不是语句的,不能以分号结束,如预处理命令。

格式输出函数

printf(格式控制字符串, 输出项表列);

格式输入函数

scanf(格式控制字符串, 地址表列);

%d或%i 按十进制有符号整数输出,正数的符号省略

%u 按十进制无符号整数输出

%o 按八进制无符号整数输出(不输出前导0)

%x或X 按十六进制无符号整数输出(不输出前导符0x)

%c 按字符型数据输出

%s 按字符串数据输出

%f 按小数形式输出(6位小数)

%p 16进制输出地址

%7.3f 7控制输出的长度 3控制小数点后的尾数

if语句switch语句的计算器

#include<stdio.h>
int main()
{
    	char opt;
    	float num1, num2, result;
   	printf("Please input: \n");
    scanf("%f%c%f", &num1, &opt, &num2);

/*    if('+' == opt )
    {
        result = num1 + num2;
    }
    else if('-' == opt)
    {
        result = num1 - num2;
    }
    else if('*' == opt)
    {
        result = num1 * num2;
    }
    else
        result = num1 / num2;
*/

    switch(opt)
 	   {
 	       case '+':result = num1 + num2;
  	                break;
 	       case '-':result = num1 - num2;
 	                break;
  	       case '*':result = num1 * num2;
 	                break;
  	      case '/':result = num1 / num2;
  	               break;
  	      default :printf("error!\n");
  	               break;
}

printf("result= %.2f\n", result);

return 0;
}

while (表达式) 语句

当表达式为非0值时,执行while语句中的内嵌语句。其特点是:先判断表达式,后执行语句。

do

循环体语句

while (表达式);

do-while语句的特点:先执行循环体,然后判断循环条件是否成立

for语句一般形式:

for(表达式1;表达式2;表达式3) 语句4

1243243243

continue语句

作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定.

一般形式: continue;

break语句

break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句

一般形式: break;

注意:break语句不能用于循环语句和switch语句之外的任何其他语句中。

循环嵌套 涉及到跨切

在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU 跨切循环层的次数;

如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面;

猜你喜欢

转载自blog.csdn.net/zzb_mx/article/details/81192144
今日推荐