WHCSRL 技术网

C的基础知识(1)

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #define x 10
  4. #define X 5
  5. #define Y X+1
  6. #define Z Y*X/2
  7. int a = 20;//全局变量
  8. int main()
  9. {
  10. //全局变量与局部变量
  11. int a = 10;//局部变量
  12. //当全局变量和局部变量冲突时,输出结果如何呢?
  13. printf("a = %%%%d", a);//a = 10;
  14. //由printf的输出结果,我们便可以明白,以局部变量优先。
  15. //变量的作用域与生命周期
  16. int n = 10; //当我们去调试左边的代码,就可以发现代码不能运行,这是为什么呢?
  17. { //这里就要牵扯到变量的作用域问题了:每个变量都有着自己的作用范围,当超出了他的作用域时,这个变量便不再能继续使用
  18. int x = 20; //如左边的代码,x是创造在括号内部,那么他的作用域就只是在括号内部。也可以说,x的生命周期是从进入这个括号时开始,出括号时结束,所以当括号外的printf想要打印x时,便会报错。
  19. printf("%%%%d ", n); //注意:作用域和生命周期虽然看起来别无二致,但仅仅是有关联,不能混为一谈。
  20. }
  21. printf("%%%%d ", x);
  22. //常量
  23. //在c语言中,常量分为四种
  24. //它们分别是:1.字面常量 2.const修饰的常变量 3.define定义的标识符常量 4.枚举常量
  25. //首先来看字面常量,例如
  26. //100
  27. //7.23
  28. //接下来是const修饰的常变量,我们要如何理解常变量这个词呢
  29. int n = 10;
  30. printf("n = %%%%d ", n);// n = 10;
  31. n = 20;
  32. printf("n = %%%%d ", n);// n = 20;
  33. //我们可以看到,n作为一个变量,它被赋予的值是可以更改的,那如果我们给它加入一个const呢?
  34. const int n1 = 10;
  35. printf("n1 = %%%%d", n1); //当我们运行代码后会发现,系统会报错:左值指定 const 对象
  36. n1 = 20; //那么我们就能明白了,const修饰后的变量是无法更改的。
  37. printf("n1 = %%%%d", n1);
  38. //既然n1无法改变,那是否意味着它现在是一个常量呢?
  39. const int n1 = 10;
  40. int arr[n1] = { 0 };
  41. //运行代码后,我们发现系统报错:应输入常量表达式
  42. //现在,大家就都能理解为什么叫常变量了,虽然它的值无法改变,但n1本身还是一个变量。
  43. //define定义的标识符常量
  44. //定义内容在第3行
  45. int arr[x] = { 0 };
  46. //我们可以看到,与const不同的是,define定义的内容是一个常量,可以用于数组;
  47. //有一点需要注意的是,define定义的x在运行中是将x替换为10,当遇到符号优先级问题时,要留意定义的值
  48. //例如
  49. //定义内容在4,5,6行 #define X 5 #define Y X+1 #define Z Y*X/2
  50. int a = Y;
  51. printf("%%%%d,%%%%d", Z, --a);
  52. //我们来解析一下这道题目,首先a = Y = X+1 = 6,接下来算Z,Z = Y * X / 2 = 6 * 5 / 2 = 15,而a = Y = 6,在--a之后printf的输出值为15 5,对吗?
  53. //这里就是一个小陷阱了,在算Z的时候,根据从小的算数习惯,我们很容易将Y直接等于6来计算
  54. // Y
  55. //但实际上的Z = X + 1 * X / 2 = 5 + 1 * 5 / 2 = 7;所以这个题目的正确答案是7 5
  56. // 注意:在c语言中,/号的值不带小数。 例:5 / 2 = 2; 5 %%%% 2 = 1.
  57. return 0;
  58. }

推荐阅读