在输出时,变量赋了值,但是输出仍未改变

这篇博客探讨了在编程中遇到的变量赋值问题。尽管在函数内部改变了局部变量的值,但在主函数中这些变化无法体现。解决这个问题的方法包括使用全局变量或通过指针来改变值。此外,文章还提到了`printf()`函数中参数计算顺序的不确定性,建议使用多个`printf()`函数来确保正确的输出顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.局部变量,在被调用函数中改变局部变量的值,不影响主函数,即:虽然在局部变量中重新进行赋值,但是在主函数中,局部变量的值仍不变。
解决办法:1.定义为全局变量,
2.用指针,通过地址改变值。
2.printf(),在printf()中输出参数的计算的先后顺序未定义,不是在前面的就先计算,后面的后计算。
解决办法:用多个printf().如:

#include<stdio.h>

int Fibonacci(int n);
int count;

int main()
{
    int n,ret;
    printf("please input n:\n");    
    ret = scanf("%d",&n);    
    if(ret!=1||n<0)    
    {        
    	printf("input error!\n");        
    	return -1;    
    }    printf("Fibonacci:%d,count:%d\n",Fibonacci(n),count);
    //在函数Fibonacci(n)中改变了count的值,但是总是输出为0,原因:printf()中先求前面还是先求后面的参数是未定义的,即在计算之前,就输出了count的值(自动初始化为0)    
    printf("count:%d",count);//正确结果
    return 0;
}

int Fibonacci(int n)
{
    count++;    
    if(n==0)    
    {
            return 0;    
     }    
     else if(n==1)    
     {
             return 1;    
     }    
     else if(n<0)    
     {
             printf("n should > 0");        
             return -1;    
      }    
      else    
      {
              return (Fibonacci(n-1)+Fibonacci(n-2));    
      }
  }
<think>好的,用户想在C语言输出变量经过计算后的初始。首先需要明确变量的初始是什么。根据引用[1],C语言中未显式初始化的自动变量(比如局部变量)的初始是不确定的,可能包含垃圾。而全局变量和静态变量会被默认初始化为零。 用户的问题可能是这样的:假设有一个变量,最初被了一个,后来经过计算改变了这个,现在想输出它最初的那个。但如果在计算过程中覆盖了原来的,直接输出是不可能的,除非在计算前保存了初始的副本。 例如,用户可能写了类似这样的代码: ```c int a = 5; // 初始赋值 a = a + 10; // 计算后改变 // 现在想输出原来的5 ``` 这候,如果没有提前保存5,就无法直接获取。解决方法是在修改前将初始保存到另一个变量中,或者在函数中使用参数传递保留原始。 另外,如果变量是动态分配的内存或指针,可能需要更复杂的处理,比如引用[3]提到的指针初始化,但同样需要保存初始。 所以,关键点在于:在修改变量之前,必须保存其初始,否则无法恢复。需要提醒用户注意变量作用域和存储类别的影响,如引用[2]所述的不同变量初始化规则。</think>在C语言中要输出变量初始赋值后的原始,需根据变量类型和作用域采用不同的处理策略: ### 一、自动变量的处理方案 对于局部变量(自动存储期变量): 1. 必须显式保存初始 ```c void calculate() { int original = 100; // 初始赋值 int backup = original; // 显式保存初始 original += 50; // 后续计算 printf("当前:%d,初始:%d\n", original, backup); } ``` 未显式初始化的局部变量会包含随机[^1],因此必须显式赋值并备份 ### 二、静态变量的特性利用 对于静态变量和全局变量: ```c static int counter = 10; // 初始被编译器保证 void modify() { int original = counter; // 读取初始 counter += 5; printf("原始:%d\n", original); } ``` 静态/全局变量会自动初始化为0[^2],但显式初始化更可靠 ### 三、指针变量的特殊处理 使用指针需注意: ```c int main() { int value = 200; int *ptr = &value; // 指针初始化[^3] int original = *ptr; *ptr = 300; printf("初始:%d\n", original); } ``` ### 四、内存动态分配场景 ```c int *create_int(int init) { int *p = malloc(sizeof(int)); *p = init; return p; } void process() { int *num = create_int(50); int original = *num; // 保存初始 *num *= 2; printf("初始:%d\n", original); free(num); } ``` ### 关键注意事项: 1. 对于自动变量,必须在修改前显式保存初始 2. 使用const修饰符创建不可变副本: ```c void calculate(const int input) { // 参数传递保留初始 int result = input * 2; printf("原始参数:%d\n", input); } ``` 3. 对于复杂数据结构,建议使用深拷贝保存初始状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值