首页 > 其他分享 >C语言没人教但必须了解的技巧

C语言没人教但必须了解的技巧

时间:2023-10-09 23:34:02浏览次数:38  
标签:typedef 技巧 int unsigned value C语言 没人教 printf bit

前言

工作了一年,对于代码的理解更进了一步,标准且好用的c代码能够使开发效率更上一层楼,这里整理了一下最近看到的一些c代码技巧,能使c代码编写更加标准化。

参考文章地址:

宏定义类

1.防止重复定义

防止头文件重复定义:

#ifndef COMDEF_H
#define COMDEF_H
// 头文件内容
#endif

防止宏重复定义:

#ifndef VALUE
	#define VALUE  100
#endif

2.重新定义类型

typedef unsigned char 		boolean; 	/* Boolean value type. */

typedef unsigned long int 	uint32; 	/* Unsigned 32 bit value */
typedef unsigned short 		uint16; 	/* Unsigned 16 bit value */
typedef unsigned char 		uint8; 		/* Unsigned 8 bit value */

typedef signed long int 	int32; 		/* Signed 32 bit value */
typedef signed short 		int16; 		/* Signed 16 bit value */
typedef signed char 		int8; 		/* Signed 8 bit value */

3.求两个数最大和最小值

#define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )

注意这里的一些特殊情况详细可参考文章 嵌入式小技巧 - 一月一星辰 - 博客园 (cnblogs.com)

4.防止数据溢出

#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))

5.返回数组元素个数

#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

位操作技巧

注意:

  • 进行位运算时数据全部是换算为二进制的;
  • 位操作符只适用于整形变量,不适合浮点数变量(本质是由于两者的数据存储类型不同)。

1.交换两个变量的值

int a = 1;
int b = 2;
a ^= b;
b ^= a;
a ^= b;
printf("a: %d b: %d\n", a, b);

2.求二进制中1的个数

int a = 5;
int count = 0;

while (a) {
  a = a&(a - 1); //每次把最低位丢弃,直到a为0.
  count++;
}
printf("%d\n", count);

3.求二进制中0的个数

int a = 5;
int count = 0;
while (a+1) {
  a = a | (a + 1);
  count++;
}
printf("%d\n", count);

4.求一个数的绝对值

int i = -2;
int j = i >> 31;

i = (i ^ j) - j;
printf("%d\n", i);

5.求一个数的相反数

int i = -2;

i = ~i + 1;
printf("%d\n", i);

6.判断一个数的奇偶性

int a = 3;

if((a&1) == 1) {
  printf("奇数\n");
} else {
  printf("偶数\n");
}

7.求两个数的平均数

int a = 3;
int b = 7;

printf("平均值: %d\n", ((a + b) >> 1));

8.从无符号类型x的第p位开始,取n位数

unsigned GetBits(unsigned x,int p, int n) {
  return (x>>(p+1-n)) & ~(~0<<n);
}

标签:typedef,技巧,int,unsigned,value,C语言,没人教,printf,bit
From: https://www.cnblogs.com/tangwc/p/17753486.html

相关文章

  • 2023-01-05vscode技巧
    csharp程序不能输入用vscode运行csharp默认使用的terminal是不支持输入的,输入没反应需要修改launch.json增加这两行我估计是关闭了什么东西,并且调用系统的terminal,具体就不懂了。"configurations":[{//Formoreinformationaboutthe'console'field,se......
  • Office三件套小技巧
    当谈到Office三件套(Word、Excel和PowerPoint)的小技巧时,以下是非常详细的内容,确保不错过任何小知识点。让我们逐个介绍:MicrosoftWord小技巧:快速格式化文本:使用Ctrl+B、Ctrl+I和Ctrl+U分别快速添加粗体、斜体和下划线格式。创建自定义标签页:在"文件"菜单中选择"选项",......
  • 【前端开发】前端开发者谷歌浏览器操作技巧
    谷歌浏览器技巧$_  上次执行结果opt键+click展开最外层元素ctr+shift+p 执行Command命令输入Capturefullsizescreenshot 按下回车截图全屏网页 ......
  • C语言 - malloc与free函数
    C 内存管理本章将讲解C中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。在C语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字......
  • 今天就差不多完成了ai编码c语言程序的过程
    不断改进的提示语:writeaprogramincandcompilebygcc,createasystemtrayicon,whentheiconisrightclicked,popupanexitmenutoexittheprogram,listeninbackgroup,whenkeycombinationCtrl+LeftArrowispressed,getcurrentactivewindowinwi......
  • C语言 模拟用户登陆场景只允许登录三次,错误三次后退出登录
    intmain(){inti=0;charpassword[20]={0};for(i=0;i<3;i++){printf("请输入密码:");scanf("%s",password);if(strcmp(password,"123")==0){printf("登陆成功\n");break;}else......
  • C语言使用%d读入字符会发生什么
    指定了%d来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(包含空格、制表符和换行符)直到遇到一个非空白字符,并期望发现一个数字字符或者一个符号(+或者-)。如果发现一个数字或符号,那么就保存并读取下一个字符;如果接下来的字符是一个数字,再保存,继续读取。如此持......
  • 简单小技巧
    C++输入不定数量个数C语言的sncaf()函数是有返回值的,会返回输入元素的个数,所以如果返回-1,就说明没有输入元素,我们用EOF代表-1,在输入的过程中需要使用ctrl+z以触发EOF状态代码如下while(scanf("%d",&a)!=EOF){//这里已经输入a了,循环体内不需要再写输入a此处进行后续一系......
  • 实验1 C语言输入输出和简单程序编写
    实验任务1(1)1#include<stdio.h>2intmain(){3printf("O\n");4printf("<H>\n");5printf("II\n");6return0;7}结果演示(2)1#include<stdio.h>2intmain(){3printf(&quo......
  • CKAD考试实操指南(八)---永恒记忆:状态持久性实践技巧
    状态持久性在这份CKAD考试实操指南中,我将为你详细介绍如何利用CKAD-exercises项目和知十平台进行CKAD考试的准备和复习。通过CKAD-exercises提供的练习题,你可以在知十平台的云原生环境中进行实践和模拟。在这个过程中,你将熟悉Kubernetes的各种操作和场景,并在实践中加深对知识的理解......