浮点数在内存中的存储
观察下面的代码,输出结果是什么呢?
1234567891011int main(){int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;}
以整数存储,以整数取出,结果相同;以浮点数存储,以浮点数取出,结果也相同。
以整数存储,以浮点数取出,结果不同;以浮点数存储,以整数取出,结果也不同。
由此可见,整数和浮点数在内存中的存储是不同的。
下面我们看一下浮点数的存储规则,浮点数在内存中的表示是由IEEE(电气与电子工程协会)规定好的。
任何一个二进制浮点数,可以表示成
(-1)^S表示符号位,s为0浮点数是正数,s为-1浮点数是负数;M表示有效数字,范围在[1,2);2^E表示指数位。 ...
倒置字符串,我爱中国,中国爱我。
描述:将一句话的单词进行倒置,标点不倒置。比如 I like China. 经过函数后变为:China. like I
有些时候,主语和宾语位置互换词义不会改变。比如,一件衣服穿两天,两天穿一件衣服。北京是首都,首都是北京。如果你已经读完了这段话,恭喜你已经浪费了几秒钟,这和这道编程题没什么关系……
思路:我们可以两次使用字符串逆序,第一次先将字符串整体逆序,第二次将单个单词再逆序。逆序字符串,无非是找到字符串的起始位置和结束位置,也就是左下标和右下标,当左下标地址小于右下标地址时,互换两个下标位置的字符串。关键在于寻找起始位置和结束位置,例如字符串arr,第一次字符串整体逆序,起始位置就是字符串的首地址arr,结束位置就是起始位置+字符串长度-1.第二次逆序每个单词,起始位置就是每个单词的起始位置,结束位置是空格或字符串0的前一位置。逆序每个单词要注意何时进行逆序,遍历整个字符串,当arr[i]的元素为空格或字符串0时,进行单词的逆序。
1234567891011121314151617181920212223242526272829303132333435#include<s ...
多种方法求两个正整数的最大公约数和最小公倍数
鲁迅说过:“求解最大公约数和最小公倍数有很多方法”,公约数,就是几个数共有的约数,最大公约数,就是公约数中最大的那个数,公倍数,就是几个数共有的倍数,最小公倍数,就是公倍数中最小的那个数。虽然看起来是句废话,其实它就是废话……下面我们看一下求解最大公约数和最小公倍数的几种方法。
求任意两个正整数的最大公约数
最大公约数(Greatest Common Divisor,GCD),先说约数,a能被b整除,b就是a的约数,几个数共有的约数就是这几个数的公约数,公约数中最大的那个数就是最大公约数。举个例子,4和20的公约数有1,2,4,最大公约数是4。可见两个数的最大公约数必不大于两数中最小的那个。
思路一:如果求出最大公约数,穷举法从小到大(从1到两数中较小的一个)遍历,然后输出最大的那个,这样做比较麻烦,不妨我们从大到小(从两数中较小的一个到1)遍历,第一个能同时整除两个数的那个即为所求。
123456789101112131415161718192021222324int main(){ int a = 0; int b = 0; int tmp = 0; int i = 0 ...
Visual Studio环境下一段有趣的代码
1234567891011int main(){ int i = 0; int arr[10] = { 0 }; for (i = 0; i <= 12; i++) { arr[i] = 0; printf("youngsay.cn\n"); } return 0;}
观察这段代码,运行会有何效果?
你可能会说,既然越界访问了,那不就报错了?其实不然,运行发现,程序没有报错,一直死循环。
注意:该段代码依赖环境,vs编译器,debug模式,x86平台下才有这样的效果。
为什么陷入了死循环,这要从栈区的使用习惯开始说起。静态变量,函数形参都存放到栈中,而栈是从高地址开始存放。**栈区的使用习惯是先使用高地址处的空间。**我们还知道,**数组随着下标变大,地址是由低到高变化的。**所以上段代码在栈中的内存布局,如下图所示。
vs编译器,debug模式,x86平台下,i和数组arr间刚好空了2个下标的空间。所以i和arr[12]指向了同一块地址,不信我们可以调试看一下i和arr[12]的地址。
当 ...
C语言实现简单的扫雷游戏
《扫雷》是一款大众类的益智小游戏,游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。
这篇博客教大家用C语言制作一个简易版扫雷游戏,和之前的井字棋大同小异。
我们准备三个文件,分别为game.c,test.c,game.h
game.c文件用来写实现游戏功能的各个函数代码,test.c文件写游戏的总流程,game.h文件用来声明函数和初始值.
先看test.c,由menu()``game()``main()三个函数组成。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051#include"game.h"menu(){ printf("--------------------\n"); printf("-----1.开始游戏-----\n"); printf("-----2.退出游戏-----\n"); prin ...
C语言实现简单的井字棋游戏
井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。
想必大家小时候都玩过井字棋,今天分享大家一个用C语言做简单的井字棋游戏的教程,通过井字棋游戏,既能回忆起童年的美好,也能熟悉简单的C语言语法.
游戏演示:
我们准备三个文件,分别为game.c,test.c,game.h
game.c文件用来写实现游戏功能的各个函数代码,test.c文件写游戏的总流程,game.h文件用来声明函数和初始值.
先来看test.c文件
文件内有三个函数,分别为菜单,游戏,主函数.
1234567void menu(){ printf("-----------------------\n"); printf("--------1.开始游戏-----\n"); printf("--------2.退出游戏-----\n"); printf("-----------------------\n");}
菜单很简单,就是开始游戏 ...
【C语言】分支和循环语句常见问题
分支语句
if-else语句
12345678910111213#include <stdio.h>int main(){ int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hello\n"); else printf("panghu\n"); return 0;}//输出结果:
123456789101112131415#include <stdio.h>int main(){ int a = 0; int b = 2; if (a == 1) if (b == 2) printf("hello\n"); else printf("胖虎\n"); else printf("panghu\n"); r ...
【JavaSE】类和对象
类的成员:字段、方法、代码块、内部类和接口等
字段
1234class Person{ public int age; public String name; public String sex;
age,name,sex这些类中方法外的变量,是字段、属性、成员变量(3种称呼均可)
123456789public class TestDemo { public static void main(String[] args) { //类的实例化 Person person=new Person(); System.out.println(person.name);//null System.out.println(person.age);//0 }}
对象的字段如果没有初始化,访问时会被设置成默认值。
默认值规则
对于各种数字类型, 默认值为 0.
对于 boolean 类型,默认值为 false.
对于引用类型(String ...
【JavaSE】数组的定义和使用
一维数组
一维数组的定义
123int[] arr={1,2,3,4,5}; //静态创建int[] arr1=new int[]{1,2,3,4,5}; //动态创建int[] arr2=new int[5];
一维数组的遍历
method 1:
123for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]);}
method 2:
123for (int x:arr) { System.out.print(x);}
method 3:
1System.out.println(Arrays.toString(arr));
理解引用
int[] arr=new int[]{1,2,3}创建一个数组,变量arr是一个引用类型,里面只保存了一个整数(数组的起始内存地址),指向{1,2,3}的存储地址。
引用,本质上就是存放了一个地址。当数组作为方法的参数时,其实是将数组的首地址作为参 ...
【C语言】基础语法的简单概括
数据类型
为了更加丰富地表达生活中的各种值,C语言中有不同的数据类型。每个数据类型有其占用空间的大小。我们用sizeof可以获取某个数据类型所占用空间的字节数。
下面这段代码:
1234567printf("%d", sizeof(char));printf("%d", sizeof(short));printf("%d", sizeof(int));printf("%d", sizeof(long));printf("%d", sizeof(long long));printf("%d", sizeof(float));printf("%d", sizeof(double));
在vs2019运行时,输出结果是:1244848
在linux平台运行时,结果是:1248848
对比发现,long在不同的编译器结果不同。c语言并没有规定long的大小,只是规定了sizeof(long)>=sizeof(int)。
变量的作用域和生命周期
作用 ...