1、在程序如何定义个变量?定义变量在内存中表明什么意思?linux
一、 变量的定义?框架
格式:数据类型 + 变量 函数
数据类型 -> 决定在内存中占用字节的大小。spa
变量名字 -> 决定如何访问到这片内存的空间。 指针
二、初始化变量的值?生命周期
1)定义的同时初始化内存
int a = 100; 作用域
2)先定义,后初始化。字符串
int a; -> 局部变量a = 随机值it
-> 全局变量a = 0
a = 100;
注意:
"左值=右值" -> 把右值(变量/常量)赋值给左值(只能是变量)。
"左值==右值" -> 判断左值是否等于右值?
三、 变量的生命周期以及做用域?
生命周期: 这个变量从何时出如今内存中到何时在内存中释放。
做用域:变量可以做用的地方。
局部变量 Vs 全局变量
1)在函数体内部定义的变量,就是局部变量,在函数体外部定义的变量,就是全局变量。
2)二者在内存中占用的空间位置?
局部变量都在存在于栈区,全局变量都是存在于数据段(已初始化->data段,未初始化->bss段)
3)变量不初始化,则局部为随机值,全局为0。
4)局部变量做用域是函数内部,全局变量做用域整个程序。
5)局部变量在栈区申请空间,在定义该变量的函数结束时,这个局部变量的空间就会释放。
全局变量在数据段申请空间,程序结束时,全局变量的空间才会被释放。
四、形式参数属于局部变量仍是全局变量?
局部变量,在栈区申请空间。
五、不一样函数中能不能定义相同名字变量。
能够,由于它们在栈区占用不一样的空间。
六、 全局变量的做用域?
只能往下,不能往上。
练习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\n",b);
return 0;
}
2、ASCII码
一、 在Ubuntu中能够查看ASCII码表
man ASCII(按'q'退出)
二、 什么是ASCII码?
其实ASCII表就是字符、八进制、十进制、十六进制转换。
八进制 十进制 十六进制 字符
Oct Dec Hex Char
060 48 30 0
101 65 41 A
141 97 61 a
int a = 65;
%d -> 以十进制形式输出内容 printf("%d\n",a); //65
%o -> 以八进制形式输出内容 printf("%o\n",a); //101
%x -> 以十六进制形式输出内容 printf("%x\n",a); //41
%c -> 以字符形式输入内容 printf("%c\n",a); //'A'
%f -> 输出浮点型数据,保留小数点后6位。
%s -> 输出字符串
%p -> 输出指针地址
结论: 其实字符类型也是整型数据。
3、语句与表达式?
表达式 = 语句;
a = 5 把5赋值给a -> 赋值语句
a = 5; 表达式
一、 逗号表达式?
计算规则:从左到右依次计算,结果以最后一个表达式为准。
例子:
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
二、自增自减
a++ 先运算后,再自加1.
++a 先自加1,再运算.
a-- 先运算后,再自减1.
--a 先自减1,再运算.
例子:
int a = 10;
printf("%d\n",a++);//10 a=11
printf("%d\n",++a);//12 a=12
printf("%d\n",a--);//12 a=11
printf("%d\n",--a);//10 a=10
三、 += -= *= /= %=
a+=5 等价于 a=a+5
四、 三目运算
形式:
表达式?结果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;
4、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\n",a);
return 0;
}
===================================================
5、linux C语言控制流
控制流有两大块,分别是分支、循环。
分支: if else switch
循环: for while do-while
一、 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\n",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\n",sum);
return 0;
}
二、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\n",sum);
return 0;
}
三、 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\n",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\n",sum);
四、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
完成:<练习>
======================================================================================================================================================