scopes.cvc 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Different shadowing concepts illustrated
  3. */
  4. extern void printInt(int val);
  5. extern void printSpaces(int num);
  6. extern void printNewlines(int num);
  7. export int main()
  8. {
  9. // this variable will be escaped below
  10. int a = 123;
  11. // The bir variable is an example of a local (ie non-escaped) variable
  12. int bir = a;
  13. /* A variable shadowed by an argument */
  14. void bar (int a)
  15. {
  16. a = 11111;
  17. printInt(a);
  18. printNewlines(1);
  19. }
  20. /* A variable initalized by a variable of the same name */
  21. void boz ()
  22. {
  23. int a = a;
  24. a = a + 11111;
  25. printInt(a);
  26. printNewlines(1);
  27. }
  28. /* using a in the inner function makes it an escaped variable */
  29. void biz ()
  30. {
  31. a = 55555;
  32. }
  33. bar(a);
  34. printInt(a);
  35. printNewlines(2);
  36. baz(a);
  37. printInt(a);
  38. printNewlines(2);
  39. bor(a);
  40. printInt(a);
  41. printNewlines(2);
  42. boz();
  43. printInt(a);
  44. printNewlines(2);
  45. printInt(bir);
  46. printNewlines(2);
  47. biz();
  48. printInt(a);
  49. printNewlines(2);
  50. printInt(bir);
  51. printNewlines(1);
  52. return 0;
  53. }
  54. /* An argument shadowed by a variable */
  55. void baz(int b){
  56. // The variable b cannot be defined in the same scope hence it is in an inner function
  57. void baz_inner(){
  58. int b = 22222;
  59. printInt(b);
  60. printNewlines(1);
  61. }
  62. baz_inner();
  63. }
  64. /* An argument shadowed by a variable */
  65. void bor(int b){
  66. void baz_inner(){
  67. void b() {
  68. printInt(33333);
  69. printNewlines(1);
  70. }
  71. b();
  72. }
  73. baz_inner();
  74. }