一起笨笨的学C——010栈.作用域

目录

前言

正文

导演——头文件

配角——*.c

主角——*_main.c

  后语

头文件

    按值传递

按引用传递


 


前言

        因为变量是在栈里,是临时变量,所以它作用的范围总是受到一些函数语句等区块的限制。从而据说能够产生千奇百怪的BUG!


正文

导演——头文件

  1 #ifndef _ex22_h
  2 #define _ex22_h
  3 #include "dbg.h"
  4 
  5 //makes THE_SIZE in ex22.c availabale to other .c files
  6 extern int THE_SIZE;
  7 
  8 //gets ande sets an internal static vaeravle in ex22.c
  9 int get_age();
 10 void set_age(int age);
 11 
 12 //updates a static variable that's iniside update_ratio
 13 double update_ratio(double ratio);
 14 
 15 void print_size();
 16 
 17 #endif

 

配角——*.c

6537278f19a04457a11aad770759bc8e.png

 

主角——*_main.c

    

#include "ex22.h"

const char *MY_NAME = "Zed A. Shaw";

void scope_demo(int count)
{
		log_info("count is : %d", count);

		if(count > 10) {
				int count=100; //BAD! BUGS!
				log_info("count in this scope is %d", count);
		}

		log_info("count is at exit: %d", count);

		count = 3000;

		log_info("count after assign: %d", count);
}

int main(int argc, char *argv[])
{
		// test out THE_AGE accessors
		log_info("My name: %s, age:%d", MY_NAME, get_age());

		set_age(100);

		log_info("My age is now: %d", get_age());

		//test out THE_SIZE extern
		log_info("THE_SIEZE IS: %d", THE_SIZE);
		print_size(argv);

		THE_SIZE = 9;
		log_info("THE SIEZE is now: %d", THE_SIZE);
		print_size();
		

		//test the ratio function static
		log_info("Ratio at first: %f", update_ratio(2.0));
		log_info("Ratio again: %f", update_ratio(10.0));
		log_info("Ratio once more: %f", update_ratio(300.0));

		//test the scope demo

		int count = 4;
		scope_demo(count);
		scope_demo(count *20);


		log_info("count after calling scope_demo: %d", count);

		return 0;
}

    


  后语

  • 头文件

    头文件是一种源代码文件,通常以 .h 或 .hpp 为后缀,用于声明函数、类、变量和常量等的定义和接口。在C/C++语言中,头文件通常包含了函数的声明、宏的定义、结构体和类的定义等,它们用于将相关的定义和接口集中在一个地方,方便其他源代码文件的引用和使用。

    头文件可以被其他源代码文件通过#include指令引入,使得其他源代码文件能够访问头文件中定义的函数、类、变量和常量等。通过使用头文件,可以提高代码的重用性和可维护性,同时也可以提供更好的代码组织结构和阅读性。

    需要注意的是,头文件只包含声明和定义的注释,不包含实现的代码,实现的代码通常是放在对应的源代码文件(通常以 .c 或 .cpp 为后缀)中的。头文件中的声明和定义相当于给其他源代码文件一个使用接口,而实现则是具体的功能的实现。

        有关头文件,无意中发现有人写的更好,更详细C语言从头学05——头文件及库文件_c语言库文件和头文件-CSDN博客

  •     按值传递

    按值传递是一种参数传递的方式,它将参数的值复制一份后传递给函数或方法,而不是传递参数的引用或地址。

    在按值传递的方式中,当函数或方法对参数进行修改时,不会影响到外部变量的值。因为传递的是参数值的副本,而不是原始变量的引用。

    在许多编程语言中,基本数据类型(如整数、浮点数、布尔值等)通常是按值传递的,而引用数据类型(如数组、字符串、对象等)通常是按引用传递的。但也有一些编程语言允许自定义数据类型按值传递。

    总结一下,按值传递是一种参数传递的方式,它将参数的值复制一份后传递给函数或方法,不会影响到外部变量的值

        代码示例

 1 #include <stdio.h>
  2 
  3 void lessFat(int weigh)
  4 {
  5      weigh = weigh -70;
  6 }   
  7 
  8 
  9 void panGuan(int stuff)
 10 {
 11     if(stuff== 180){
 12         printf("恭喜主人减肥成功!\n");
 13     }
 14     else{
 15         printf("主人,萝卜青菜各有所爱,当个肥佬也不赖!额……你永远是我最爱的那颗大白菜!\n"); }
 16 }
 17 
 18 int main(int argc, char *argv[ ])
 19 {
 20     int meat = 250;
 21 
 22     lessFat(meat);
 23     panGuan(meat);
 24 
 25     
 26     return 0;
 27 }
~                                                                                                                       
~         

 

  • 按引用传递

    按引用传递(pass-by-reference)是一种函数参数传递的方式。按引用传递时,函数接收的是变量的内存地址,而不是变量的值的副本。这意味着,在函数内部修改参数的值,会影响到原始变量的值。

    通过按引用传递参数,可以避免在函数调用时对参数进行复制,从而提高程序的性能。此外,按引用传递还可以实现函数对参数进行修改的功能。

    在一些编程语言中,如C++和Python,可以显式地使用引用作为函数参数来实现按引用传递。而在其他一些编程语言中,如Java和C#,则使用特殊的引用类型来实现类似的效果。

        代码示例

  1 #include <stdio.h>
  2 
  3 
  4 void less_fat(int *rou)
  5 {
  6     *rou = *rou - 70;
  7 }
  8 
  9 void panGuan(int stuff)
 10 {
 11     if(stuff== 180){
 12         printf("恭喜夫人减肥成功!\n");
 13     }
 14     else{
 15         printf("夫人,减肥之路任重道远,加油!\n"); }
 16 }
 17 
 18 int main(int argc, char *argv[ ])
 19 {
 20     int meat = 250;
 21 
 22     less_fat(&meat);
 23     panGuan(meat);
 24 
 25     return 0;
 26 }
~           

 

1.我对文件做了一点小改动,把两个c文件包含的头文件dbg放在了ex22.h中,也能正常编译。

 觉得很有意思,网上一查,原来C编译器在编译过程中只会处理每个C文件中的头文件一次。当多个C文件包含同样的头文件时,只有第一个C文件会实际包含并编译这个头文件。

当其他C文件也包含这个头文件时,编译器会忽略它们,因为已经在第一个C文件中包含过了。这种机制可以避免头文件包含的重复和冗余。

 2.导演/配角/主角是我对这些编译文件的一种变相理解,你们觉得呢?        

 3.以上代码示例纯粹是最近个人的恶趣味,如果恰巧有人认识家里,还请保密,嘿嘿!                        

 

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值