C语言入门 读取变量的值

**题目:**已知main函数中有一个变量i,我们想要读取它的值并输出。

不得不说,这是一道相当难的题目,可能会难倒一大片刚学C语言的新手。但是不要怕,这道题目其实没有我们想象中的那么难。就算我们现在什么也不知道,我们也可以先写出一个模板:

1
2
3
4
5
6
7
#include <stdio.h>
int main()
{
int i = 12345;
//...
return 0;
}

很多同学到这一步可能就想到了:哎,输出可以用printf函数。那么我们就可以写出printf("%d\n", /*?*/);。到这一步可能就有很多同学放弃了。这里注释的地方应该怎么写呢?

这个地方确实有点难想,但是可能有些聪明的小伙伴可能就想到了,我们可以在这里放一个值,这样printf函数就可以把这个值输出了。

那么我们怎么让这个值等于i呢?

这时候我们就很自然地想到了,函数的返回值就是一个值。那么问题就很自然地转化成了我们要编写一个函数,让它的返回值等于i

可以看到变量iint类型的,那么我们就可以定义一个返回值为int类型的函数:

1
2
3
4
int add(int a, int b)
{
return a + b;
}

那么问题就很自然地转化成了找到一个a和b使得a+b的值等于i

很多同学到这一步就卡住了。我们怎么才能找到这样的a和b呢?

这个问题确实有点复杂,那么我们简化一下问题,让它只用考虑一个参数。

我们很自然地想到可以通过强制类型转换的方式来实现这一目的,所以我们可以调用((int(int))add)(a)

现在问题就简化成了找到一个a,使得调用强制类型转换过的函数add后,函数的返回值恰好等于i

到这一步很多同学可能就放弃了。虽然我们简化了这个问题,但是寻找这个a还是非常困难。

但是不要怕。我们在数学中学过,一个数加上0,结果和这个数相等。很多同学可能就豁然开朗了。这个a为0行不行呢?我们试试看:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int add(int a, int b)
{
return a + b;
}

int main()
{
int i = 12345;
printf("%d\n", ((int(int))add)(0));
return 0;
}

我们一看打印结果,这就很神奇了,果然是12345,正好等于i

所以说,编程和数学密不可分。这么难的一道编程题目,我们只要稍加转换,再利用我们熟知的数学定理,就可以很轻松地得出答案。

那么为什么会恰好等于i呢,就留作课后习题吧!