c程序设计语言笔记2

《C程序设计语言》(第2版·新版)读书笔记 《C程序设计语言》第2版· 第1章 导言 1.1 入门 1.2 变量与算术表达式 基本数据类型 short 短整型 int 整型 long 长整型 char 字符型 float 浮点型 double 双精度浮点型 类型限定符unsiged C语言本身并没有定义输入/输出功能。 printf()函数是标准库函数。 整除 5/9 整除,结果是0 5/9.0 结果是浮点...... 阅读详情

练习2-1:

  编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现:

  采用打印标准头文件中的相应值:

#include <stdio.h>
 #include <limits.h>
 //determine ranges of types
 int main()
 {
 printf("采用打印标准头文件limits.h中的相应值:\n");
 //signed types
 printf("signed char min = %d\n", SCHAR_MIN);
 printf("signed char max = %d\n", SCHAR_MAX);
 printf("signed short min = %d\n", SHRT_MIN);
 printf("signed short max = %d\n", SHRT_MAX);
 printf("signed int min = %d\n", INT_MIN);
 printf("signed int max = %d\n", INT_MAX);
 printf("signed long min = %ld\n", LONG_MIN);
 printf("signed long max = %ld\n", LONG_MAX);
 //unsigned types
 printf("unsigned char max = %u\n", UCHAR_MAX);
 printf("unsigned short max = %u\n", USHRT_MAX);
 printf("unsigned int max = %u\n", UINT_MAX);
 printf("unsigned long max = %lu\n", ULONG_MAX);
 system("pause");
 return 0;
 }

这种实现方法没什么好讨论的,只要知道相应的头文件和变量名就可以了。

直接计算:

#include <stdio.h>
 //determine ranges of types
 int main()
 {
 printf("采用直接计算的方式:\n");
 //signed types
 printf("signed char min = %d\n", -(char)((unsigned char)~0>>1)-1);
 printf("signed char max = %d\n", (char)((unsigned char)~0>>1));
 printf("signed short min = %d\n", -(short)((unsigned short)~0>>1)-1);
 printf("signed short max = %d\n", (short)((unsigned short)~0>>1));
 printf("signed int min = %d\n", -(int)((unsigned int)~0>>1)-1);
 printf("signed int max = %d\n", (int)((unsigned int)~0>>1));
 printf("signed long min = %ld\n", -(long)((unsigned long)~0>>1)-1);
 printf("signed long max = %ld\n", (long)((unsigned long)~0>>1));
 //unsigned types
 printf("unsigned char max = %u\n", (unsigned char)~0);
 printf("unsigned short max = %u\n", (unsigned short)~0);
 printf("unsigned int max = %u\n", (unsigned int)~0);
 printf("unsigned long max = %lu\n", (unsigned long)~0);
 system("pause");
 return 0;
 }

小结:

  利用按位运算符进行计算。表达式:(char)((unsigned char)~0>>1)

  先把数字0的各个二进制位全部转换为1:取反,~0

  然后,将结果值转换为unsigned char类型:(unsigned char)~0

  再把这个unsigned char类型值右移一位以清除符号位:(unsigned char)~0 >> 1

  最后,把它转换为char类型:(char)((unsigned char)~0>>1)

  这一系列操作的最终结果就得到了signed类型字符的最大值。

  而其signed类型字符的最小值加负号后还需减去1才是最小值。(K&R书的中文习题解答此处并没有减去1)

练习2-2

在不使用&&或||的条件下编写一个与下面的for循环语句等价的循环语句

for(i = 0;i < lim - 1 && (c = getchar()) != '\n' && c != EOF;++i)

与之等价的循环语句:

enum loop {NO,YES};
enum loop okloop = YES;
i = 0;
while(okloop == YES)
if (i >= lim - 1)
okloop = NO;
else if((c = getchar()) = '\n')
okloop = NO;
else if(c == EOF)
okloop = NO;
else{
s[i] = c;
++i;
}

练习2-3

编写函数htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整数值。

#include <stdio.h>

#define YES 1
#define NO 0

int hoti(char s[]);


main()
{
	int c,i;
	char s[10];
	i = 0;
	while ((c = getchar()) != '\n' )
		s[i++] = c;
	printf("the number is %d\n", hoti(s));
	getch();
	

}
/* convert hexdecimal strings to intrger */

int hoti(char s[])
{
	int hexdigit, i, inhex, n;
	i = 0;
	if(s[i] == '0'){
		if(s[++i] == 'x' || s[i] == 'X')
			i++;
	}
	n = 0;
	inhex = YES;
	while(inhex == YES){
		if(s[i] >= '0' && s[i] <= '9')
			hexdigit = s[i] - '0';
		else if (s[i] >= 'a' && s[i] <= 'f')
			hexdigit = s[i] - 'a' + 10;
		else if (s[i] >= 'A' && s[i] <= 'F')
			hexdigit = s[i] - 'A' + 10;
		else
			inhex = NO;
		if(inhex == YES)
		n = n * 16 + hexdigit;
		i++;
	}
	return n;

}
在网上看到一段大牛写的利用移位实现本题要求功能的代码,看不太懂先贴在下面。据说移位是c语言的精华所在,善于利用移位可以解决很多问题。只是我目前还没有这样的体会,可能是见识的太少了。

=============使用移位的思想================
BOOL   HexToDec(   LPCTSTR   shex,int&   idec   )  
     {  
      int   i,mid;  
      int   len   =   lstrlen(   shex   );      
      if(   len>8   )     return   FALSE;     
      mid   =   0;   idec   =   0;  
      for(   i=0;i<len;i++   )  
      {  
          if(   shex[i]>='0'&&shex[i]<='9'   )   mid   =   shex[i]-'0';  
          else   if(   shex[i]>='a'&&shex[i]<='f'   )   mid   =   shex[i]   -'a'   +10;  
          else   if(   shex[i]>='A'&&shex[i]<='F'   )   mid   =   shex[i]   -'A'   +10;  
          else   return   FALSE;      
          mid   <<=   ((len-i-1)<<2); //最精妙的地方,需要好好琢磨。 
          idec   |=   mid;      
      }      
      return   TRUE;  
   } 
练习2-6

编写一个函数setbits(x,p,n,y),该函数返回对x执行些列操作后的结果值:将x中从第p位开始(向右!)的n个位设置为y中最右边的n位的值,x的其余各位保持不变。

#include <stdio.h>
#include <stdlib.h>

unsigned setbits(unsigned ,int,int,unsigned);

main()
{
	unsigned x = 0331;
	unsigned y = 0251;
	int p = 5,n = 4;
	printf("The convert number 0f %o is %o.",x,setbits(x,p,n,y));
	system("pause");
}

/*setbits:set n nits of x at position p with bits of y */
unsigned setbits(unsigned x,int p, int n, unsigned y)
{
	return x & ~(~(~0 << n) << (p + 1 - n)) | (y & ~(~0 << n)) << (p + 1 - n);
}
看到一个递归实现2进制输出的小程序如下:

void digui(int x)
{
     int j;
     j=x%2;
     x=x/2;
     if(x>0)
     digui(x);
     printf("%d",j);
}

按位运算符的运用:

C语言中提供了6个位操作符。这些运算符只能作用于整型操作数,即只能作用于带符号或无符号的char、short、int与long类型:

&  |  ^   >>  <<   ~

1.按位与的运用:&

  提取特定位、清零其余位:
  例如:mask中要保留的位上为1,其他位为0,a=a0&mask

      判断int的奇偶(效率比%2高得多):
  例如:(a&1)==0则为偶数,反之为奇数。(原理:因为奇数二进制末位总为1,偶数总为0。原数与00…001进行按位与运算,就得到了a二进制末位的值。)

2.按位异或运用:^

  特定位取反
  例如:mask中要取反的位为1,其余为0,a=a0^mask

     不用中间变量交换两数的值
  例如:要交换a、b的值只需:a=a^b;b=a^b;a=a^b;即可。
  (原理:上式即a=(a^b)^(a^b)^b,b=a^b^b。由于一个数与它本身进行“按位异或”运算得到0,任何一个数与0进行“按位异或”运算得到它本身,故上式即是:a=[b的原值],b=[a的原值]。这样就达到了交换a、b的目的。)

练习2-7 

将x中从p位开始的n个位求反,x的其余各位保持不变。

事实上,只要用对应位为1,其余位为0 的屏蔽码与x进行异或操作即可实现。与1异或取反,与0异或不变。

练习2-8

编写函数rightrot实现循环右移。

/* rightrot: rotate x to the right by n positions */
unsigned rightrot(unsigned x,int n)
{
	int wordlength(void);
	int rbit;					/* rightmost bit */
	
	while (n-- > 0){
		rbit = (x & 1) << (wordlength() - 1);
		x = x >> 1;
		x = x | rbit;
		}
	return x;
}

函数wordlength()的作用是计算运行程序的计算机所用的字长

int wordlength(void)
{	
	int i;
	unsigned v = (unsigned) ~0;
	for(i = 0;(v = v >> 1) > 0; i++);
	return i;
}
K&R的书中文习题解答中给出的另外一种无循环的版本如下:

unsigned rightrot(unsigned x, int n)
{
	int wordlength(void);
	unsigned rbits;
	
	if ((n = n % wordlength()) > 0){
		rbits = ~(~0 << n) & x;
		rbits = rbits << (wordlength() - n);
		x = x>> n;
		x = x | rbits;
	}
	return x;
}

练习 2-9 

利用x &= (x - 1)可以删除x中的最右边为1 的一个二进制位,重写bitcount函数,计算x中1的个数。

/* bitcount: count 1 bits in x -fast version */
int bitcount(unsigned x)
{
	int b;
	for (b = 0; x != 0; x &= x - 1)  //for(b = 0;x != 0;x >>= 1)
		b++;                      //if(x & 01) b++;  old version
	return b;
}





C语言程序设计笔记(2) 在C语言程序中,一共有三种程序结构:顺序结构、选择结构(分支结构)、循环结构。 三者的特点 顺序结构,从头到尾一句接着一句的执行下来,直到执行完最后一句,无循环,无分支; 选择结构,到某个节点后,会根据一次判断的结果来决定之后向哪一个分支方向执行; 循环结构,循环结构有一个循环体,循环体里是一段代码。对于循环结构来说,关键在于根据判断的结果,来决定循环体执行多少次。 C语言循环控制语句是一个基于C... 阅读详情

相关推荐

Centos7.9使用kubeadm部署K8S集群

使用kubeadm部署一个k8s集群,单master+2worker节点。

lldhsds的专栏 1300

2.8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端再移入)n(二进制)位后所得到的值。

Answer Book  第一种解法 是 每次将x最右端右移1位 与 该位移到最左端  进行或运算 ,这样进行n次循环即可。 源程序:   /*rightrot: rotate x to the right by n position*/ unsigned rightrot(unsigned x, int n) {  int wordlength(void);  int rbit;

zombie 6404

本地部署DeepSeek连接MATLAB:打造私有化AI编程助手全攻略

大型语言模型(LLM)通过理解自然语言生成代码、解释技术概念,其核心原理是基于海量数据训练的Transformer架构。这项技术为工程计算和数据分析带来了效率革命,尤其在代码生成、调试辅助和文档自动化等场景价值显著。开源模型如DeepSeek-coder凭借优秀的代码理解能力,结合Ollama提供的本地化部署方案,实现了完全离线、低延迟的私有化部署。通过配置国内镜像加速下载,并利用MATLAB内置的HTTP通信函数构造API请求,工程师可以在熟悉的MATLAB环境中直接调用本地模型,处理数据清洗、算法验证等

weixin_30239339的博客 516

(unsigned char) ~0 >> 1

(unsigned char) ~0 >> 1

那年聪聪 3017

S32K144之芯片锁死解锁——关闭debug端口

S32K144之芯片锁死及解锁 经常捣鼓单片机就会发现,时常会因为某些操作不当导致芯片锁死情况的发生,通过Jlink我们可以读到芯片的ID,但是无法进行Debug,这很是让人苦恼。 基于S32K144的芯片锁死,一般有如下几种可能: 1、时钟配置异常,过高的配置时钟频率以及不配置时钟,都有可能造成芯片保护锁死,我就曾经因为不注意把时钟配置代码注释掉,导致芯片锁死。 2、我是微软雅黑烧写断电,如果在...

weixin_41935674的博客 1万+

【全部更新】2025金地杯E题山西省大学生数学建模思路代码文章教学:高速铁路牵引供电系统能耗优化

问题四将列车的运行速度与发车时间同时作为优化变量,建立联合优化模型,目标是在考虑电价机制和调度均衡性的前提下,使牵引供电系统一天内的总电费支出最小。问题三在考虑分时电价机制的基础上,基于遗传算法优化列车速度组合,使牵引供电系统一天内的总电费支出最小。然而,在实际运营中,不同时段的电价差异显著,合理安排列车的运行时间与运行速度,可有效降低系统的总电费支出。本研究聚焦于高速铁路牵引供电系统的能耗与电费优化问题,针对列车运行速度、发车时间与分时电价的综合影响,提出一系列数学模型,以实现系统能耗与电费的最小化。

xb459149247的博客 5289

c程序设计语言 库,《C程序设计语言》 练习2-8

问题描述练习 2-8 编写一个函数rightrot(x, n),该函数返回将x循环右移(即从最右端移出的位将从最左端移入)n(二进制)位后所得到的值。Write a functionrightrot(x,n)that returns the value of the integerxrotated to the right bynbit positions.解题思路这个题目我感觉可以有...

weixin_39654436的博客 275

Autosar CAN 网络管理标准文档

Autosar CAN 网络管理标准文档

蚂蚁小兵 923

leetcode 61. Rotate List

Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: Input: 1->2->3->4->5->NULL, k = 2 Output: 4->5->1->2->3->NULL Explanati...

luoshaohong的博客 166

标题:Stata17安装后遇到Java安装问题解决方法

设置JAVA_HOME环境变量:在Windows上,您需要设置JAVA_HOME环境变量以告诉Stata Java的安装路径。d. 输入变量名为JAVA_HOME,变量值为Java安装路径。注意:请确保您的Java版本与Stata兼容,并使用正确的Java安装路径。设置Stata的Java安装路径:现在,您需要告诉Stata Java的安装路径。如果您看到Java版本信息,则表示Java已成功安装。如果没有安装,请先下载并安装Java。确认Java已安装:首先,请确保您的计算机上已经正确安装了Java。

CyberSparkZ的博客 2867

ThingsBoard教程(十六):RPC部件的使用

前言 各位读者好,截止目前,ThingsBoard系列文章已经做了十篇,分别是 ThingsBoard教程(一):ThingBoard介绍及安装 ThingsBoard教程(二):租户,租户配置,部件组模块的使用 ThingsBoard教程(三):系统设置模块的使用 ThingsBoard教程(四):规则链简介与操作 ThingsBoard教程(五):客户,资产管理 ThingsBoard教程(六):设备管理 ThingsBoard教程(七):模拟设备遥测 ThingsBoard教程(八):自定义UI T

知无涯 4576

C语言学习笔记(2)之运算符与表达式

运算符与表达式 表达式 表达某一个意思的式子。 a = b + c 在C语言中,表达式一般是指用运算符连接操作数的式子 注意:是表达式就一定会有一个值。 运算符 用来进行某种运算的符号就叫运算符。 如: +、-、*、… 几目运算符?表示的该运算符需要带几个操作数。 单目运算符:该运算符只需要一个操作数。如:++、–… 双目运算符:该运算符需要两个操作数。如:+ - *… 三目运算符:该运算符需要三个操作数。如: ?:(条件运算符) 结合性:代表的是运算的优先顺序 例子: + 结合性从左至右 a +

Black_vv的博客 1438

Java 新纪元 — JDK 25 + Spring Boot 4 全栈实战(十九):微服务实战——Boot 4 + Spring Cloud 2026.x,构建高并发电商分布式系统

Component@Slf4j@Autowired// 白名单路径@Override// 白名单放行// 提取Token// 传递用户信息到下游服务.mutate().build();@Override// 最高优先级if (bearer!@Component技术点Boot 3 时代Boot 4 时代提升线程模型平台线程池(200线程上限)虚拟线程(百万级并发)50x+服务通信。

qq_17204557的博客 185

C程序设计语言(第2版)读书笔记

wandermen的专栏 953

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

个人学习C程序设计语言(第2版·新版)笔记

\n换行 \t制表符 \a 响铃符 \\ 反斜杠 \b 回退符 \? 问号 \f 换页符 \' 单引号 \n 换行符 \" 双引号 \r 回车符 \ooo 八进制 \t 横向制表符 \xhh 十六进制 \v 纵向制表符 在运算符前后各放一个空格是运算组合更清楚,花括号的位置不重要,选择一种风格,并保持下去。 所有变量必须先说明后使用,说明通常放在函数开始处的的可执行语句之前。用

921

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

《C语言程序设计》笔记p2

高位溢出,低位补零有符号整数:低位溢出,高位补符号位无符号整数:低位溢出,高位补0作用: 按位 0变 1, 1变0。运算符 ~~ 表达式输入一个整数,用有符号 变量 x 绑定。答案避免隐式转换,使用显示类型转换。语法(新类型) 表达式。作用:根据布尔表达式的值,执行不同的表达式并返回结果。?C 语言中唯一的一个三元运算符表达式 2 或 表达式 3 最多只能运行一个。示例:写一个程序,输入成绩(0~100分),如果成绩大于等于 60 则成绩为 100 分,否则成绩为0分。打印最终成绩。答案。

2401_83507683的博客 509

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C语言程序设计学习笔记:P2-计算

本系列文章为浙江大学翁恺C语言程序设计学习笔记,前面的系列文章链接如下: C语言程序设计学习笔记:P1-程序设计与C语言 文章目录一、变量1.1 变量定义1.2 变量赋值与初始化1.3 程序的输入1.4 常量VS变量1.5 浮点数小测验二、表达式2.1 表达式2.2 运算符优先级2.3 交换变量2.4 复合赋值与递增递减小测验 一、变量 1.1 变量定义 上周我们写了一行代码,来计算两个数相加。 printf("12+34=%d", 12+34); 当然,我们也可以做相减。比如我们是收银员,顾客给我们

InnerPeaceHQ的博客 1721

C语言程序设计摘抄笔记2

2020/7/16 在C语言中,&有三种作用,分别如下: 取地址。单目运算符。用来取一个变量的地址。 比如 int i, *p; p = &i;//这里的&作用是取变量i的地址。 位操作中的与操作运算符。 也就是常说的and操作,双目运算符。 计算的时候按位计算,&两边操作数对应位上全为1时,结果的该位值为1。否则该位值为0 比如 0x12&0x23 转为二进制为: B00010010&B00100011, 按位计算结果为B00000010, 即结果为

m0_49159142的博客 254

c语言程序设计3000字读书笔记,C语言程序设计---读书笔记2

·读书笔记按照章节记录,原书作者 丹尼斯里奇·笔记接C语言程序设计---读书笔记1·笔记中相同的知识点可能来自书中不同的章节·解释与思考部分并不全是书中的内容,也包括经验之谈、网上资料五 指针与数组指针是一种保存地址的变量。5.1指针与地址对变量取地址用运算度 &,取指针指向的地址取内容用*。解释与思考5.1已知: int a = 7;int *p = &a;区...

weixin_30050671的博客 1296

C程序设计语言——第2章学习笔记

在传统的C语言用法中,变量名使用小写字母,符号常量名全部使用大写字母。 char  字符型  占用一个字节,可以存放本地字符集中地一个字符。 int   整型   通常反映了所用机器中整数的最自然长度。 float  单精度浮点型 double 双精度浮点型   long类型的常量以字母 l 或者 L 结尾,如123456789L。后缀 f 或者 F 便是flo

学渣,你妈妈叫你回家写代码了 1208

Java研发笔记2——C语言程序设计学习笔记1

Java研发笔记2——C语言程序设计学习笔记1

Lbs_gemini0603的博客 570

【学习笔记】C语言程序设计 1.2 C语言快速入门

课程:中国大学MOOC 北京大学 郭炜《程序设计与算法(一)C语言程序设计》

MaroBytes门寒子's Blog 391

C语言笔记——第2章 选择结构程序设计

🌿前言:在我看来,书应该越读越薄的,所以我的笔记尽量记录了每一个点,可供复习与查阅,但没有详细的解释。我的C语言的笔记是在谭浩强老师的C程序设计(第五版)的基础上总结归纳的,结合了一些我自己的见解。如果是有其他见解 ,也欢迎大家提出。

昭与云的博客 234

2025/2/2 DAY1 听课笔记 c语言程序设计 c语言概论

机器语言 汇编语言 高级语言。计算机语言的发展历程。

2401_83522810的博客 126

《 C语言程序设计(第2版)》 读书笔记

《 C语言程序设计(第2版)》 读书笔记 —Brian W.Kernighan 等著 徐宝文 李志 译 在C语言中,所有的变量必须先声明,后使用。声明通常放在函数起始处,在任何执行语句之前。 stdio.h scanf scanf_s printf 解密 标准库 字符输入、输出 getchar() putchar() strlen() 求字符串长度和sizeof的区别 string.h 探秘

鲲鹏望舒 1595

读《C程序设计语言》笔记2

学习字符数组的笔记: 1 /***************2 description:3 读入一组文本行,并把最长的文本行打印出来。 4 ***************/5 #include <stdio.h>6 7 #define MAXLINE 10008 int getline(char line[], int maxline);9 void copy(char to[...

weixin_30821731的博客 74
上一篇: c程序设计语言笔记1
下一篇: c程序设计语言笔记3
zhanghui310
博客等级 码龄18年 2粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值