2-4小时突击C语言(2)

存储类

这个面试过程中也经常被问到。

register存储类:用于定义存储在寄存器中而不是 RAM 中的局部变量。所以变量的访问速度更快,但是它不能直接取地址。

例如:

register int miles;

static 存储类:指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。

static 修饰符也可以应用于全局变量。当 static 修饰全局变量时,会使变量的作用域限制在声明它的文件内。

例如:

#include <stdio.h>
 
/* 函数声明 */
void func1(void);
 
static int count=10;        /* 全局变量 - static 是默认的 */
 
int main()
{
  while (count--) {
      func1();
  }
  return 0;
}
 
void func1(void)
{              
  static int thingy=5;
  thingy++;
  printf(" thingy 为 %d , count 为 %d\n", thingy, count);
}

实例中 count 作为全局变量只能在该文件下的函数内使用,thingy 使用 static 修饰后,不会在每次调用时重置。

输出结果:

thingy 为 6 , count 为 9

thingy 为 7 , count 为 8

thingy 为 8 , count 为 7

thingy 为 9 , count 为 6

thingy 为 10 , count 为 5

thingy 为 11 , count 为 4

thingy 为 12 , count 为 3

thingy 为 13 , count 为 2

thingy 为 14 , count 为 1

thingy 为 15 , count 为 0

extern存储类:定义在其他文件中声明的全局变量或函数。当使用 extern 关键字时,不会为变量分配任何存储空间,而只是指示编译器该变量在其他文件中定义。

例如:

第一个文件:main.c
#include <stdio.h>
 
int count ;
extern void write_extern();
 
int main()
{
   count = 5;
   write_extern();
}
第二个文件:support.c
#include <stdio.h>
 
extern int count;
 
void write_extern(void)
{
   printf("count is %d\n", count);
}

第二个文件中的 extern 关键字用于声明已经在第一个文件 main.c 中定义的 count。

输出结果:

count is 5

运算符

运算符包括有:算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、杂项运算符

算术运算符:+、-、*、/、%、++、--

注意a++与++a的区别:

int c;

int a = 10;

c = a++;

printf("先赋值后运算:\n");

printf("Line 1 - c 的值是 %d\n", c );

printf("Line 2 - a 的值是 %d\n", a );

输出结果:

Line 1 - c 的值是 10

Line 2 - a 的值是 11

int c;

int a = 10;

c = ++a;

printf("Line 3 - c 的值是 %d\n", c );

printf("Line 4 - a 的值是 %d\n", a );

输出结果:

Line 3 - c 的值是 11

Line 4 - a 的值是 11

关系运算符:==、!=、>、<、>=、<=。最常应用于条件真假判断,if( A==B )

逻辑运算符:&&、||、!。也最常应用于条件真假判断,if( A&&B )

位运算符:&、|、^(异或运算符)

p q p & q p | q p ^ q

0 0 0 0 0

0 1 0 1 1

1 1 1 1 0

1 0 0 1 1

如果:

A = 0011 1100

B = 0000 1101

A & B = 0000 1100

A | B = 0011 1101

A ^ B = 0011 0001

~A = 1100 0011

赋值运算符:

运算符 例子 运算符 例子

= C=A+B <<= C<<=2相当于C=C<<2

+= C+=A相当于C=C+A >>= C>>=2相当于C=C>>2

-= C-=A相当于C=C-A &= C&=2相当于C=C&2

*= C*=A相当于C=C*A ^= C^=2相当于C=C^2

/= C/=A相当于C=C/A |= C|=2相当于C=C|2

杂项运算符:sizeof()、&、*、? :

例子:

#include <stdio.h>
 
int main()
{
   int a = 4;
   short b;
   double c;
   int* ptr;
 
   /* sizeof 运算符实例 */
   printf("Line 1 - 变量 a 的大小 = %lu\n", sizeof(a) );
   printf("Line 2 - 变量 b 的大小 = %lu\n", sizeof(b) );
   printf("Line 3 - 变量 c 的大小 = %lu\n", sizeof(c) );
 
   /* & 和 * 运算符实例

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等

全部评论
register 是C语言中的一种存储类(storage class),用于提示编译器将变量存储在CPU的寄存器中,以提高访问速度。然而,register存储类的使用已经在现代C语言标准中被废弃,因为编译器通常会智能地选择合适的寄存器来存储变量,而不需要程序员显式地声明。 在过去,程序员可能会使用 register 存储类来建议编译器将频繁使用的变量存储在寄存器中,以提高程序的性能。例如: register int count = 0; 然而,现代编译器通常会更好地优化代码,以便更好地利用寄存器,因此显式使用 register 存储类的需求已经减少。 在C语言的最新标准(C11)中,register 存储类已被标记为废弃,编译器可以选择忽略它。程序员不再需要显式地使用 register,而可以依赖于编译器进行优化。因此,通常不建议在现代C代码中使用 register存储类。
3 回复 分享
发布于 2023-09-21 16:35 广东
运算符 例子 运算符 例子那里是什么?没看明白
点赞 回复 分享
发布于 2023-07-20 17:06 广东
extern 存储类: 这是C和C++编程语言中的一种存储类别,用于声明在其他文件中定义的全局变量或函数。 定义在其他文件中声明的全局变量或函数: 表明这个变量或函数的实际定义(分配存储空间)位于其他文件中,而不是当前文件中。这是一种在多个文件***享变量或函数的方式。 不会为变量分配任何存储空间: 当使用 extern 关键字声明变量时,编译器不会在当前文件中为该变量分配存储空间,而只是告诉编译器这个变量的定义在其他地方。这样的声明通常用于在一个文件中引用另一个文件中定义的全局变量。 只是指示编译器该变量在其他文件中定义: 这意味着在编译时,编译器会知道该变量或函数在其他文件中存在,而不会在当前文件中生成实际的存储空间分配。
点赞 回复 分享
发布于 2023-11-16 11:30 广东
😀
点赞 回复 分享
发布于 02-04 22:10 山东

相关推荐

10-15 09:13
已编辑
天津大学 soc前端设计
点赞 评论 收藏
分享
1 5 评论
分享
牛客网
牛客企业服务