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
完成:<練習>
======================================================================================================================================================