c語言規定函數的定義
① 什麼是c語言函數(9)
extern int x,y; 說明x,y為外部整型變數
下面分別介紹以上四種存儲類型:
一、自動變數的類型說明符為auto。
這種存儲類型是C語言程序中使用最廣泛的一種類型。C語言規定, 函數內凡未加存儲類型說明的變數均視為自動變數, 也就是說自動變數可省去說明符auto。 在前面各章的程序中所定義的變數凡未加存儲類型說明符的都是自動變數。例如:
{ int i,j,k;
char c;
……
}等價於: { auto int i,j,k;
auto char c;
……
}
自動變數具有以下特點:
1. 自動變數的作用域僅限於定義該變數的個體內。在函數中定義的自動變數,只在該函數內有效。在復合語句中定義的自動變數只在該復合語句中有效。 例如:
int kv(int a)
{
auto int x,y;
{ auto char c;
} /*c的作用域*/
……
} /*a,x,y的作用域*/
2. 自動變數屬於動態存儲方式,只有在使用它,即定義該變數的函數被調用時才給它分配存儲單元,開始它的生存期。函數調用結束,釋放存儲單元,結束生存期。因此函數調用結束之後,自動變數的值不能保留。在復合語句中定義的自動變數,在退出復合語句後也不能再使用,否則將引起錯誤。例如以下程序:
main()
{ auto int a,s,p;
printf(" input a number: ");
scanf("%d",&a);
if(a>0){
s=a+a;
p=a*a;
}
printf("s=%d p=%d ",s,p);
}
{ auto int a;
printf(" input a number: ");
scanf("%d",&a);
if(a>0){
auto int s,p;
s=a+a;
p=a*a;
}
printf("s=%d p=%d ",s,p);
}
s,p是在復合語句內定義的自動變數,只能在該復合語句內有效。而程序的第9行卻是退出復合語句之後用printf語句輸出s,p的值,這顯然會引起錯誤。
3. 由於自動變數的作用域和生存期都局限於定義它的個體內( 函數或復合語句內), 因此不同的個體中允許使用同名的變數而不會混淆。 即使在函數內定義的自動變數也可與該函數內部的復合語句中定義的自動變數同名。例5.14表明了這種情況。
[例5.14]
main()
{
auto int a,s=100,p=100;
printf(" input a number: ");
scanf("%d",&a);
if(a>0)
{
auto int s,p;
s=a+a;
p=a*a;
printf("s=%d p=%d ",s,p);
}
printf("s=%d p=%d ",s,p);
}
本程序在main函數中和復合語句內兩次定義了變數s,p為自動變數。按照C語言的規定,在復合語句內,應由復合語句中定義的s,p起作用,故s的值應為a+ a,p的值為a*a。退出復合語句後的s,p 應為main所定義的s,p,其值在初始化時給定,均為100。從輸出結果可以分析出兩個s和兩個p雖變數名相同, 但卻是兩個不同的變數。
4. 對構造類型的自動變數如數組等,不可作初始化賦值。
二、外部變數外部變數的類型說明符為extern。
在前面介紹全局變數時已介紹過外部變數。這里再補充說明外部變數的幾個特點:
1. 外部變數和全局變數是對同一類變數的兩種不同角度的提法。全局變是是從它的作用域提出的,外部變數從它的存儲方式提出的,表示了它的生存期。
2. 當一個源程序由若干個源文件組成時, 在一個源文件中定義的外部變數在其它的源文件中也有效。例如有一個源程序由源文件F1.C和F2.C組成: F1.C
int a,b; /*外部變數定義*/
char c; /*外部變數定義*/
main()
{
……
}
F2.C
extern int a,b; /*外部變數說明*/
extern char c; /*外部變數說明*/
func (int x,y)
{
……
}
在F1.C和F2.C兩個文件中都要使用a,b,c三個變數。在F1.C文件中把a,b,c都定義為外部變數。在F2.C文件中用extern把三個變數說明為外部變數,表示這些變數已在其它文件中定義,並把這些變數的類型和變數名,編譯系統不再為它們分配內存空間。 對構造類型的外部變數, 如數組等可以在說明時作初始化賦值,若不賦初值,則系統自動定義它們的初值為0。
三、靜態變數
靜態變數的類型說明符是static。 靜態變數當然是屬於靜態存儲方式,但是屬於靜態存儲方式的量不一定就是靜態變數, 例如外部變數雖屬於靜態存儲方式,但不一定是靜態變數,必須由 static加以定義後才能成為靜態外部變數,或稱靜態全局變數。 對於自動變數,前面已經介紹它屬於動態存儲方式。 但是也可以用static定義它為靜態自動變數,或稱靜態局部變數,從而成為靜態存儲方式。
由此看來, 一個變數可由static進行再說明,並改變其原有的存儲方式。
1. 靜態局部變數
在局部變數的說明前再加上static說明符就構成靜態局部變數。
例如:
static int a,b;
static float array[5]={1,2,3,4,5};
靜態局部變數屬於靜態存儲方式,它具有以下特點:
(1)靜態局部變數在函數內定義,但不象自動變數那樣,當調用時就存在,退出函數時就消失。靜態局部變數始終存在著,也就是說它的生存期為整個源程序。
② C語言中怎麼自己定義並調用函數
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//聲明一個求和的函數
int sum(int a, int b);
int main(int argc, char* argv[])
{
int x = 5, y = 7;
int s = sum(x, y); //調用函數
printf("x + y = %d ", s);
system("pause");
return 0;
}
//定義求和函數
int sum(int a, int b)
{
return a + b;
}
更多C語言教程
③ C語言中函數的定義格式是什麼,函數原型聲明的語法格式
函數定義就是規定函數的格式與功能。
函數聲明就是在函數調用之前進行的一種說明。
下面舉例說明兩者的語法格式:
#include<stdio.h>
int fun(int a, int b); // 函數的聲明
void main()
{
int x=1, y=2;
int c;
c = fun(x+y);
}
// 下面的fun函數就是函數的定義
int fun(int a, int b)
{
return a+b;
}
註:如果被調函數(上例中為fun函數)寫在調用處之前,可以不聲明(本例是現在調用處 (c = fun(x+y);)之後)。
④ C語言 函數定義概念問題
先舉個例子:
#include <stdio.h>
int max(int,int); //這是函數max的申明,最後要加分號
int main()
{
int a=1,b=2,c;
c = max(a,b); //這是函數max的使用
printf("%d",c);
return 0;
}
int max(int n,int m) //這是函數max的定義部分,最後不加分號
{
if (n>m)
return n;
else
return m;
}
不能在函數體內定義函數是什麼意思?
【就是說函數在程序中不能嵌套定義,這個和Pascal語言不同,例如上面程序中,max函數不能定義在main函數中間】
定義是聲明還是使用?
【定義既不是申明,也不是使用,函數具體功能的實現代碼叫做函數的定義,如上面程序最後7行就是定義】
函數不是應該先聲明在使用嗎?
【是的,但如果函數定義在函數使用之前,就可以不用申明(如下面程序)。函數定義在函數使用後的情況下(如上面程序),先聲明,能使編譯器在編譯在編譯過程中能夠識別使用的函數】
#include <stdio.h>
int max(int n,int m) //這是函數max的定義部分,最後不加分號
{
if (n>m)
return n;
else
return m;
}
int main()
{
int a=1,b=2,c;
c = max(a,b); //這是函數max的使用
printf("%d",c);
return 0;
}
定義如何解釋?
【見第二個問題】
⑤ C語言中如何定義並調用自定義函數
要在主函數中調用其他函數就在主函數中直接寫出你的函數名(如果需要參數的話就傳入參數就可以了)看下面voidmain(){tr();//因為你自定義這個函數不需要參數所以直接調用就可以了}其他函數調用也一樣,一個函數可以調用另一個函數(不能調用主函數)
⑥ C語言中定義函數有什麼規定嗎
除了下面的,都可以使用auto :聲明自動變數 一般不使用
double :聲明雙精度變數或函數
int: 聲明整型變數或函數
struct:聲明結構體變數或函數
break:跳出當前循環
else :條件語句否定分支(與 if 連用)
long :聲明長整型變數或函數
switch :用於開關語句
case:開關語句分支
enum :聲明枚舉類型
register:聲明積存器變數
typedef:用以給數據類型取別名(當然還有其他作用)
char :聲明字元型變數或函數
extern:聲明變數是在其他文件正聲明(也可以看做是引用變數)
return :子程序返回語句(可以帶參數,也看不帶參數)
union:聲明聯合數據類型
const :聲明只讀變數
float:聲明浮點型變數或函數
short :聲明短整型變數或函數
unsigned:聲明無符號類型變數或函數
continue:結束當前循環,開始下一輪循環
for:一種循環語句(可意會不可言傳)
signed:生命有符號類型變數或函數
void :聲明函數無返回值或無參數,聲明無類型指針(基本上就這三個作用)
default:開關語句中的「其他」分支
goto:無條件跳轉語句
sizeof:計算數據類型長度
volatile:說明變數在程序執行中可被隱含地改變
do :循環語句的循環體
while :循環語句的循環條件
static :聲明靜態變數
if:條件語句
⑦ C語言函數定義和說明的格式
C語言的函數定義格式是:
函數類型 函數名稱 ( 參數列表 )
{
//函數體
}
函數聲明,不是說明的格式是「函數定義格式」的第一行,然後加 「;」,即:
函數類型 函數名稱 ( 參數列表 );
特別地,在函數聲明中的參數列表中,不需要給出具體的變數名稱,但必須給出每個變數的類型。
⑧ c語言中定義一個函數有什麼規則(說的通俗點)
有區別的,函數聲明以分號結尾,函數定義後跟函數體
具體形式上可以相同,但聲明也可以用省略模式,比如:
int
f(int
a,int
b)
{
return
a+b;
}
其聲明可以是:int
f(int
a,int
b);
也可以是:int
f(int,int);
⑨ C語言函數在定義時要注意什麼
一是函數名,最好是讓人一看就知道這個函數是干什麼用的,起碼別讓人誤解。
二是參數個數,一般是越少越好
三是注釋,這玩意對寫的人不重要,對讀的人可就重要了
四是函數大小,據說嚴格的時候,函數體不能超過5行,做不到的話,能短點就短點,太長就分成幾個函數寫
⑩ c語言中函數定義和聲明有什麼區別
從C語言編譯器的角度來看,函數聲明只是一種協議,它告訴了調用者在調用這個函數之前需要給他什麼參數,一般參數是通過寄存器或者壓棧的方式傳給被調用函數的,具體這些參數如何使用以及返回什麼值到相應的寄存器里返回給調用者則是定義所描述的。