写在开篇
本人是暑假刚开始学的C语言,人人都说写博客好啊,然而自己总不知道写什么。因为我总感觉咱们社区似乎已经涵盖了从基础到进阶到大神的所有相关的技术内容了,而且恐怕都写得比我好。所以我就转换思路,把自己学习过程中犯错的或者自己觉得有价值的题目记录一下,给自己记录,也和别人共享,因为题目带含情境,往往是更容易对应到某些知识点上去的。当然,由于我这是才开篇,且本人也是新手上路,难免会有解释不清晰,或者有地方出错的地方,还请有了解的大佬指正。(默认用的VS2022开发环境)
一道不错的代码运算题[前后置++、逗号表达式]
下面代码运行结果是
#include <stdio.h>
int main()
{
int a, b, c;
a = 5;
c = ++a;
b = ++c, c++, ++a, a++;
b += a++ + c;
printf("a = %d b = %d c = %d\n:", a, b, c);
return 0;
}
这个蛮有意思,main函数的前三行是比较简单的,我们看(下面省略其他只看必要处拆解分析):
int a, b, c;
//这里就是初始创建a,b,c三个整型 int 的变量
a = 5;
//这里是给a赋值5
c = ++a;
//前置++,这里相当于两步,首先a=a++即a=a+1=6,然后c=a=6
//至此a=6,c=6
我们接着往下看就不太容易了
b = ++c, c++, ++a, a++;
//这一步初学者容易不理解,尤其是 , 的作用,其实这一步就是由逗号隔开的步骤依次从左往右进行
//b = ++c 然后c=c++ 然后a=++a 然后a=a++ 后面三步与b不再相关
//所以就是
//c前置++先c=c+1=7,然后b=c=7
//c=c++=8
//a=++a=7
//a=a++=8 这里前置与后置不影响,因为不参与其他运算就是自己加一,这里就是整题的难点
//这里属于一种没有括号的多项的逗号表达式,具体内容可以参见本社区的相关博客
//到此a=8,b=7,c=8
链接: link
要注意有无括号对于逗号表达式而言是很重要的,因为直接影响到结果
接着就好办了
b += a++ + c;
printf("a = %d b = %d c = %d\n:", a, b, c);
return 0;
}
b += a++ + c
这里就是参与运算的后置++,先b=b+a+c=7+8+8=23,然后a=a++=9
再printf打印得 a=9 b=23 c=8,解出
再看一题[就近原则]
下面代码输出的结果是:( )
#include <stdio.h>
int num = 10;
int main()
{
int num = 1;
printf("num = %d\n", num);
return 0;
}
注意到这里大括号内外有两次int num赋值,实际上取main函数内的 int num = 1
所以结果就是num = 1,这里有几点要说明:
- 不允许在同一个作用域中定义多个相同名称的变量
- 允许在不同的作用域中定义多个相同名称的变量
- 不同作用域中定义的变量,在访问时采用就近原则
所以对于以上代码
对于以上代码:
全局作用域中的num和main中的num可以同时存在,不会冲突,因为不是同一个作用域
在main函数中访问num时,采用就近原则,因此访问的是main中的num,相当于将全局作用域中的num屏蔽了
实际上就近原则还有很多地方会有,这里由于main函数大括号的存在,也不是非常”就近“,比如在if else中可以更明显的体现
如
#include <stdio.h>
int num = 10;
int main()
{
int a = 0;
int b = 2;
if(a==1)
if (b==2)
printf("666\n");
else
printf("555\n");
return 0;
}
这里应该打印什么呢?
如果你认为这里else与第一个if对应,可能打印
555
666
但实际上这里else就近只与第二个if 关联而b==2所以不走else直接打印
666
以上就是主要内容,大家有问题欢迎交流指正。