一、在程序如何定义个变量?定义变量在内存中代表什么意思?
1、 变量的定义?
格式:数据类型 + 变量
数据类型 -> 决定在内存中占用字节的大小。
变量名字 -> 决定如何访问到这片内存的空间。
2、初始化变量的值?
1)定义的同时初始化
int a = 100;
2)先定义,后初始化。
int a; -> 局部变量a = 随机值
-> 全局变量a = 0
a = 100;
注意:
"左值=右值" -> 把右值(变量/常量)赋值给左值(只能是变量)。
"左值==右值" -> 判断左值是否等于右值?
3、 变量的生命周期以及作用域?
生命周期: 这个变量从什么时候出现在内存中到什么时候在内存中释放。
作用域:变量能够作用的地方。
局部变量 Vs 全局变量
1)在函数体内部定义的变量,就是局部变量,在函数体外部定义的变量,就是全局变量。
2)两者在内存中占用的空间位置?
局部变量都在存在于栈区,全局变量都是存在于数据段(已初始化->data段,未初始化->bss段)
3)变量不初始化,则局部为随机值,全局为0。
4)局部变量作用域是函数内部,全局变量作用域整个程序。
5)局部变量在栈区申请空间,在定义该变量的函数结束时,这个局部变量的空间就会释放。
全局变量在数据段申请空间,程序结束时,全局变量的空间才会被释放。
4、形式参数属于局部变量还是全局变量?
局部变量,在栈区申请空间。
5、不同函数中能不能定义相同名字变量。
可以,因为它们在栈区占用不同的空间。
6、 全局变量的作用域?
只能往下,不能往上。
练习1: 以下程序在内存空间中是如何变化的?结果是多少?
#include <stdio.h>
int fun2(int c)
{
c = 20;
return 0;
}
int fun1(int b)
{
int c = 10;
fun2(c);
return 0;
}
int main(int argc,char *argv[])
{
int a,b = 5;
fun1(b);
printf("b = %d ",b);
return 0;
}
二、ASCII码
1、 在Ubuntu中可以查看ASCII码表
man ASCII(按'q'退出)
2、 什么是ASCII码?
其实ASCII表就是字符、八进制、十进制、十六进制转换。
八进制 十进制 十六进制 字符
Oct Dec Hex Char
060 48 30 0
101 65 41 A
141 97 61 a
int a = 65;
%d -> 以十进制形式输出内容 printf("%d ",a); //65
%o -> 以八进制形式输出内容 printf("%o ",a); //101
%x -> 以十六进制形式输出内容 printf("%x ",a); //41
%c -> 以字符形式输入内容 printf("%c ",a); //'A'
%f -> 输出浮点型数据,保留小数点后6位。
%s -> 输出字符串
%p -> 输出指针地址
结论: 其实字符类型也是整型数据。
三、语句与表达式?
表达式 = 语句;
a = 5 把5赋值给a -> 赋值语句
a = 5; 表达式
1、 逗号表达式?
计算规则:从左到右依次计算,结果以最后一个表达式为准。
例子:
d = (a=a+b,c=b+c,a+c);
a=1+2=3
c=2+3=5
d=a+c=3+5=8
例子:
int a=1,b=2,c=3,d;
d = (a+b,b-=c,c+=c); -> 6
d = (c=a+b,b-=c,c+=b); -> 2
2、自增自减
a++ 先运算后,再自加1.
++a 先自加1,再运算.
a-- 先运算后,再自减1.
--a 先自减1,再运算.
例子:
int a = 10;
printf("%d ",a++);//10 a=11
printf("%d ",++a);//12 a=12
printf("%d ",a--);//12 a=11
printf("%d ",--a);//10 a=10
3、 += -= *= /= %=
a+=5 等价于 a=a+5
4、 三目运算
形式:
表达式?结果1:结果2;
如果表达式为真,则结果就是结果1。
如果表达式为假,则结果就是结果2。
例子1:
int a = 3,b = 2,c;
c = (a >= b ? a : b); -> 求a与b之间的最大值。
例子2:
A ? i : j; 以下哪个表达式与之等价? 假 -> 0 真 -> 1
A==0 ? i:j;
A!=0 ? i:j; -> OK
A==1 ? i:j;
A!=1 ? i:j;
四、IO函数?
头文件:#include <stdio.h>
printf() -> 输出带格式内容到屏幕上
scanf() -> 从键盘中输入带格式内容
int a;
a -> 代表这整片内存空间
&a -> 代表这整片内存空间的地址
例子:
===================================================
#include <stdio.h>
int main(int argc,char *argv[])
{
int a;
scanf("%d",&a);
printf("%d ",a);
return 0;
}
===================================================
五、linux C语言控制流
控制流有两大块,分别是分支、循环。
分支: if else switch
循环: for while do-while
1、 while循环
1)基本框架
while(判定条件)
{ -> 复合语句:循环体
表达式;
}
-> 循环体之外
2)处理流程
判定条件 -> 真 -> 执行循环体内容 -> 判定条件 -> 假 -> 跳出循环
3)死循环
死循环就是判定条件恒为真,无法通过判断判定条件为假来跳出循环。
while(1)
{
xxxx; -> 一直执行!
}
4)省略{}写法
======================================================
while(1)
xxxx; -> 紧跟while(1)语句的表达式就是循环体的内容
yyyy; -> 不属于循环体的内容
等价于
while(1)
{
xxxx;
}
yyyy;
======================================================
while(1); -> 有分号,有循环,但是循环体没有内容。
xxxx;
yyyy;
等价于
while(1)
{
}
xxxx;
yyyy;
结论: 当循环体表达式大于2个时,复合语句{}不能省略!
当循环体表达式只有1个,则{}可以省略!
练习2: 使用while循环实现将所有的参数都打印出来!
#include <stdio.h>
int main(int argc,char *argv[]) // ./xxx aaa bbb argc=3 argv[0]="./xxx" argv[1]="aaa"
{
int i = 0; //初始化语句
while(i < argc) //0~2 判定条件
{
printf("argv[%d] = %s ",i,argv[i]);
i++; //条件修改
}
return 0;
}
练习3: 从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x
#include <stdio.h>
int main(int argc,char *argv[])
{
int x,i=1,sum=0;
scanf("%d",&x);
while(i<=x)
{
sum += i;
i++;
}
printf("sum = %d ",sum);
return 0;
}
2、for循环
1)基本框架
for(初始化语句;判定条件;变量操作) -> 里面三个语句不一定要填,可以空白!
{ -> 循环体
}
循环体之外。
2)处理流程
1
for(2;3;4)
{
5;
}
6;
1->2->3->真->5->4->3->假->6 (初始化语句,只会执行一次)
3)死循环
for(;;); 等价于 while(1);
等价于 等价于
for(;;) 等价于 while(1)
{ {
} }
4)省略{}写法
for(;;)
xxxx; -> 紧跟语句才是循环体的内容
yyyy; -> 不属于循环体的内容
等价于
for(;;)
{
xxxx;
}
yyyy;
练习4: 从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x,要求使用for循环。
#include <stdio.h>
int main(int argc,char *argv[])
{
int x,i,sum=0;
scanf("%d",&x);
for(i=1;i<=x;i++)
{
sum += i;
}
printf("sum = %d ",sum);
return 0;
}
3、 do-while循环
1)基本框架
do{ -> 循环体
}while(判定条件); -> 注意: 没有分号是语法出错!
2)处理流程
先执行一遍循环体 -> 判定条件 -> 真 -> 执行循环体 -> 判断条件 -> 假 -> 跳出循环
3)死循环
do{
}while(1);
4)省略{}写法
例子1:
do
xxxx;
while(1);
等价于
do{
xxxx;
}while(1);
例子2:
do
xxx;
yyy; -> 编译出错: error: expected ‘while’ before ‘printf’
while(1);
结论: 当表达式只有一条时,则复合语句可以省略,如果大于1条表达式,则必须添加,否则编译出错。
while(1)
xxxx;
yyyy;
等价于
do
xxxx;
while(1);
yyyy;
练习5:使用do-while循环实现将所有的参数都打印出来!
int i = 0;
do{
printf("argv[%d] = %s ",i,argv[i]);
i++;
}while(i<argc);
练习6:从键盘中获取整型数,存放到x中,并计算出1+2+3+4+...+x,要求使用do-while循环。
int x,i=1,sum=0;
scanf("%d",&x);
do{
sum+=i;
i++;
}while(i<=x);
printf("sum = %d ",sum);
4、if分支
用法一: if单独使用
1)基本框架
if(判定条件) -> 如果判定条件为真,则执行复合语句,否则不执行复合语句!
{ //复合语句
}
2)省略{}写法
if(判定条件)
xxxx; -> 如果条件为真,则执行xxxx;如果为假,就不执行xxxx;
yyyy; -> yyyy;不是if语句的判定范围,所以无论条件真假,这个yyyy都会被执行。
等价于
if(判定条件)
{
xxxx;
}
yyyy;
================================================
if(判定条件);
xxxx;
yyyy;
等价于
if(判定条件)
{
}
xxxx;
yyyy;
用法二: if与else配合使用
1)基本框架
if(判定条件) -> 如果判定条件为真,就执行复合语句1
{ //复合语句1
}
else -> 不满足判定条件的情况,就会执行复合语句2
{ //复合语句2
}
2)省略{}写法
if(判定条件)
xxxx;
else
yyyy; --> 可以!
if(判定条件) xxxx else yyyy; -> 编译出错: expected ‘;’ before ‘else’
if(判定条件)
xxxx;
else
yyyy;
else
zzzz; --> 编译出错: error: ‘else’ without a previous ‘if
if(判定条件1)
xxxx;
if(判定条件2)
yyyy;
else
zzzz; -> 编译通过,else受到最近的if语句的影响!
用法三: 多个情况判断 else if
1)基本框架
if(判定条件1) -> 如果判定条件1是真,则执行复合语句1
{ //复合语句1
}
else if(判定条件2) -> 如果判定条件1为假,则进行判断判定条件2,如果为真,则执行复合语句2
{ 复合语句2
}
else -> 不满足以上所有的判定条件,则执行复合语句3。
{ 复合语句3
}
练习7: 分别使用以上三种办法,完成该题。
从键盘中获取一个数字
0~100 -> 打印small
101~200 -> 打印middle
201~300 -> 打印large
完成:<练习>
======================================================================================================================================================
{
int a=0;
printf("Please enter the number: ");
scanf("%d",&a);//输入数字
if(a >= 0 && a <= 100)//0~100 -> 打印small
printf("small ");
if(a >= 101 && a <= 200)//101~200 -> 打印middle
printf("middle ");
if(a >= 201 && a <= 300)//201~300 -> 打印large
printf("large ");
if(a < 0 || a > 300)//不在上诉范围输出error
printf("error ");
return 0;
}
{
int a=0;
printf("Please enter the number: ");
scanf("%d",&a);//输入数字
if(a >= 0 && a <= 100)//0~100 -> 打印small
printf("small ");
else
{
if(a >= 101 && a <= 200)//101~200 -> 打印middle
printf("middle ");
else
{
if(a >= 201 && a <= 300)//201~300 -> 打印large
printf("large ");
else//不在上诉范围输出error
printf("error ");
}
}
return 0;
}
{
int a=0;
printf("Please enter the number: ");
scanf("%d",&a);//输入数字
if(a >= 0 && a <= 100)//0~100 -> 打印small
printf("small ");
else if(a >= 101 && a <= 200)//101~200 -> 打印middle
printf("middle ");
else if(a >= 201 && a <= 300)//201~300 -> 打印large
printf("large ");
else //不在上诉范围输出error
printf("error ");
return 0;
}