[Linguagem C] Resumo do conhecimento da função (1)

introdução

O método de programação modular geralmente decompõe um problema relativamente complexo em vários subproblemas relativamente simples e depois os resolve separadamente para reduzir a complexidade da resolução do problema. Se você já possui um código que resolve um determinado subproblema, pode usar o código diretamente, que é uma função. Um programa em linguagem C consiste em um ou mais módulos de programa, e cada módulo de programa consiste em uma ou mais funções, portanto, as funções são um mecanismo indispensável e importante para a realização da programação modular.

1. Visão geral da função


  • A essência de uma função: um segmento de programa que pode ser chamado repetidamente e possui funções relativamente independentes
  • O objetivo da introdução de funções:
    1. Facilitar a programação estruturada e modular
    2. Resolver a duplicação de código

chamada de função
Quando um programa em linguagem C é grande, ele pode ser composto de vários arquivos de origem, mas apenas um arquivo de origem contém a função principal main() e outros arquivos de origem não podem conter a função principal. A função main pode chamar outras funções, mas não o contrário. Outras funções podem chamar umas às outras, e a mesma função pode ser chamada quantas vezes quiser por uma ou mais funções. Quando uma função chama outra função, a primeira é chamada de função chamadora e a última é chamada de função chamada.
  • Classificação de função:
    Classificação de função

2. Definição de função

1. Definição de função sem parâmetros

Digite name function name ()
{ function body } ou digite name function name (void) { function body }







  • O nome do tipo especifica o tipo de valor de retorno da função. Quando omitido, o tipo de valor de retorno da função padrão é int e void significa que a função não possui parâmetros.
  • O corpo da função contém uma parte de declaração e uma parte de instrução (pode ser apenas parte dela ou nada dela)
  • A parte da declaração é principalmente a declaração de variáveis ​​ou a declaração da função que está sendo chamada.
  • A parte de execução consiste em instruções de execução, e as funções da função são implementadas por essas instruções

2. Definição de funções parametrizadas

Nome do tipo nome da função (lista de parâmetros formais)
{ corpo da função } formato da lista de parâmetros formais: tipo 1 parâmetro formal 1, tipo 2 parâmetro formal 2,..., tipo n parâmetro formal n



#include<stdio.h>
#include<math.h>
double fact(int n);//函数声明
int main()
{
    
    
	int i = 1;
	double x, item, s = 0;
	printf("输入x的值:");
	scanf("%lf", &x);//由键盘读入浮点数x的值
	item = x;
	while (fabs(item) >= 0.00001)
	{
    
    
		s = s + item;//累加一项
		i++;//累计次数
		item = pow(x, i) / fact(i);//调用函数,fact()函数中i为实参
	}
	printf("和是:%lf\n", s);
	return 0;
}
double fact(int n)//函数首部 n为形参
{
    
    
	int i;
	double jc = 1;//阶乘变量赋初值
	for (i = 1; i < n; i++)//计算阶乘
		jc = jc * i;
	return jc;//返回阶乘
}

3.Definição de função vazia

tipo nome nome da função ()
{ }


  • Usado para declarar uma função, que pode ser uma função que precisa ser melhorada no futuro.
  • O objetivo é ter uma estrutura de programa clara, boa legibilidade e fácil expansão de funções no futuro.

3. Chamada de função


O objetivo de definir uma função é reutilizá-la, portanto, a função da função só pode ser realizada chamando a função no programa.


1. A forma e o processo de chamada de função

(1) Forma geral de chamada de função

Nome da função (coluna da lista de parâmetros reais)

  • A lista de parâmetros reais é o parâmetro real, ou parâmetro real, para abreviar. Pode ser uma constante, variável, expressão
#include <stdio.h>

// 定义一个函数,它有三个形式参数
void print_values(int a, float b, char c) {
    
    
    printf("The values are: %d, %f, %c\n", a, b, c);
}

int main() {
    
    
    int x = 3;
    float y = 3.14;
    char z = 'A';

    // 调用函数print_values(),传递常数、变量和表达式作为实参
    print_values(1, y, 'B');
    print_values(x, 2.5, z);
    print_values(x + 1, y * 2, z + 1);

    return 0;
}

  • Separe os parâmetros reais com vírgulas
  • O número e o tipo dos parâmetros reais devem ser consistentes com o número e o tipo dos parâmetros da função.
  • Se for uma função sem parâmetros, não há lista de parâmetros real, mas os parênteses não podem ser omitidos.

(2) Como chamar funções

Ⅰ.Declaração de função
把函数调用作为一条语句
一般形式:函数名(实参表列);
这种方式常用于调用一个没有返回值的函数,只要求函数完成一定的操作
Ⅱ.Expressão de função
函数调用作为表达式中的一部分出现在表达式中,
以函数返回值参与表达式的运算
Ⅲ. Uso de aninhamento de função

O programa em linguagem C inicia a execução a partir da função principal, e a execução da função personalizada é obtida chamando a função personalizada. Quando a função personalizada terminar, retorne do final da função personalizada para o ponto de chamada na função principal e continue a execução até que a função principal termine.

Chamadas de função aninhadas

C语言的函数定义是互相平行、独立的,也就是说,在定义函数时,
一个函数内不能再定义另一个函数,也就是不能嵌套定义,
但可以嵌套调用函数

(3) O processo de chamada de função

  • 1. Aloque memória para todos os parâmetros formais da função chamada, calcule os valores dos parâmetros reais e atribua-os aos parâmetros formais correspondentes, um por um (para funções sem parâmetros, este trabalho não é feito)
  • 2. Aloque espaço de armazenamento para as variáveis ​​definidas na parte de descrição da função e, em seguida, execute as instruções executáveis ​​da função em sequência. Quando a instrução "return (expression);" é executada, o valor de retorno é calculado (se for uma função sem valor de retorno, este trabalho não será realizado).
  • 3. Libere o espaço de armazenamento ocupado pelas variáveis ​​definidas nesta função (para variáveis ​​​​do tipo estático, o espaço não será liberado), retorne à função de chamada principal para continuar a execução

2. Passagem de parâmetros


  • Ao chamar uma função parametrizada, existe uma relação de transferência de dados entre a função chamadora e a função chamada.
  • A função chamadora transfere dados para a função chamada principalmente por meio dos parâmetros da função.
  • A função chamada transfere dados para a função chamadora geralmente por meio da instrução return.
  • Parâmetros formais são variáveis ​​entre parênteses após o nome da função quando a função é definida.
  • Os parâmetros reais referem-se às constantes, variáveis ​​e expressões entre parênteses após o nome da função ao chamar a função.
  • Ao chamar uma função, passe o valor do parâmetro real para o parâmetro formal para que o parâmetro formal seja numericamente igual ao parâmetro real.
  • Duas maneiras de passar dados de parâmetros: passando por valor e passando por endereço

(1) Passagem por valor


  • Quando uma função é chamada, a função chamadora passa o valor do parâmetro real para o parâmetro formal da função chamada. As alterações no valor do parâmetro formal não afetarão o valor do parâmetro real. Este é um método de transferência de dados unidirecional .
  • Quando o parâmetro real é uma variável, constante, expressão, elemento de matriz ou função, a função usa a fórmula para passar os dados por valor.

#include <stdio.h>
void swap(int x, int y)
{
    
    
    int t;
    t = x; x = y; y = t;
    printf("x=%d,y=%d\n", x, y);
}
int main() 
{
    
    
    int a, b;
    scanf("%d,%d", &a, &b);
    swap(a, b);
    printf("a=%d,b=%d\n", a, b);
    return 0;
}

resultado:
Insira a descrição da imagem aqui


  • O número e o tipo de dados dos parâmetros reais devem ser consistentes com os parâmetros formais, caso contrário ocorrerá um erro de compilação.
  • Quando uma função é definida, o sistema não aloca unidades de armazenamento aos parâmetros formais. O sistema apenas aloca unidades de armazenamento aos parâmetros formais quando a função é chamada. Após a conclusão da chamada, a unidade de armazenamento ocupada pelo parâmetro formal é liberada.
  • Mesmo que os parâmetros reais e formais tenham o mesmo nome, serão alocadas unidades de armazenamento diferentes.
  • Quando a transferência de parâmetro é "transferência de valor", é uma transferência unilateral, ou seja, o parâmetro real passa o valor para o parâmetro formal, mas o valor do parâmetro formal não pode ser passado para o parâmetro real, o que significa que o a modificação do parâmetro formal não afetará o parâmetro real correspondente. Isso ocorre porque na memória é liberada a unidade de armazenamento dos parâmetros reais e formais.Após a execução da função, a unidade de armazenamento dos parâmetros formais é liberada.

(2) Entregar por endereço


Quando os parâmetros formais de uma função são do tipo array ou ponteiro, a passagem de parâmetros nas chamadas de função é chamada de passagem por endereço. Como o endereço é passado, os parâmetros formais e reais compartilham a mesma unidade de armazenamento, desta forma, os dados do endereço podem ser referenciados diretamente ou processados ​​​​através dos parâmetros formais para atingir o objetivo de alterar o valor real do parâmetro.


3. Valor de retorno da função

1. O valor de uma função só pode ser retornado à função chamadora por meio da instrução return.

return 表达式;
return (表达式);//如 a>b?:a:b

Várias instruções de retorno são permitidas em uma função, mas logicamente apenas uma instrução de retorno pode ser executada por chamada.
2. Se não houver necessidade de retornar um valor de função da função chamada, a instrução return pode ser omitida. Neste momento, após executar a última instrução no corpo da função, a função chamada saltará automaticamente e retornará um valor incerto. 3. O
tipo de valor da expressão na instrução return deve ser consistente com o tipo da função no definição de função.

4. Declaração de função

1. Declare primeiro e depois use
(1) Ao chamar uma função de biblioteca, geralmente você precisa usar o comando "#include" no início do programa
(2) Ao chamar uma função definida pelo usuário, o formato de declaração da função é:

类型名 函数名(参数类型1,参数类型2...);
类型名 函数名(参数类型1 形参1,参数类型2 形参2,...);

2. Quando uma das duas condições a seguir for atendida, a função chamada não precisa ser declarada na função de chamada principal

  • Quando a função chamada é definida antes da função chamadora
  • Quando o tipo de valor de retorno da função chamada é inteiro ou caractere

5. Chamadas de funções aninhadas

As definições de funções na linguagem C são todas paralelas e independentes umas das outras. Ou seja, ao definir uma função, uma função não pode conter a definição de outra função. Se outra função for chamada dentro de uma função, ela será chamada de chamada aninhada de funções. Em outras palavras, durante o processo da função chamada, outra função pode ser chamada.

Acho que você gosta

Origin blog.csdn.net/m0_74102736/article/details/130446639
Recomendado
Clasificación