【咬文嚼字】c语言中你可能不知道的小知识
前言
作为一名c语言萌新,在学习完c中的基本语句后,就能写出一些小的c语言程序了,但在写的过程中可能总是会碰到一些小地方困扰着你,因此我决定写下这篇文章记录下我遇到的一些小问题帮助你查漏补缺,并扫清那些你记忆中模棱两可的地方。
一.Switch与case
请问以下代码在屏幕上输出什么?
#include<stdio.h>int main()
{int n = 1;switch (n){case 1:printf("%d ", 1);case 2:printf("%d ", 2);case 3:printf("%d ", 3);}
}
答案:
1 2 3
解答:
小小开胃菜,相信大部分朋友都能答上来。
switch语句在执行中当某条case语句满足条件后,不仅执行当前case语句的内容,而是后面的每条case语句都将被执行,且跳过判断。因此在使用switch语句时一定要加上break语句以保证在执行了当前case语句后跳出,而不再往后执行,从而导致程序出错。
改进如下:
#include<stdio.h>int main()
{int n = 1;switch (n){case 1:printf("%d ", 1);break;case 2:printf("%d ", 2);break;case 3:printf("%d ", 3);break;}
}
二.Switch与defualt
请问以下代码在屏幕上输出什么?
#include<stdio.h>int main()
{int n = 1;switch (n){case 1:printf("%d ", 1);case 2:printf("%d ", 2);default:printf("%d ", 3);}
}
答案:
1 2 3
解答:
一些朋友可能会稍微卡一下,但是还是能立马反应过来,defualt与case一样,如果没有适当加入break,只要前面有case执行了,后面的每一分支内的语句都会被执行,包括defualt语句。
三.while与scanf
请问以下代码的作用是什么?
while(scanf("%d",&n) != EOF)
{;
{
答案:
循环输入内容到n中直到遇到EOF。
解答:
EOF(End Of File),在c语言标准库中表示文件结束符,也代表-1,如果想手动输入EOF的话,需要使用<ctrl+z>并按下enter输入,整个语句所要表达的意思也就是当你在输入文件结束标志时才会使语句停止,这样的语句常在牛客网的题目中使用,当题目要求你有多组输入,并且没有明确到底输入多少组时,使用这样的语句是一个非常棒的写法。
四.sizeof与strlen
请问以下代码在屏幕中输出什么?
#include<stdio.h>int main()
{char arr[] = "abcde";printf("%d ", strlen(arr));printf("%d", sizeof(arr));return 0;
}
答案:
5 6
解答:
要解答这个问题的答案需要先知道arr数组在内存中如何存放的:
当你在数组中存放字符串时,会将你的每个字符依次存放到其中,并在最后放上一个‘\0’,以标志字符串的结尾。
strlen:
strlen计算的是从字符串第一个字符到‘\0’字符前的长度(不包括'\0') !!!!
szieof:
sizeof计算的是从字符串第一个字符到‘\0’字符的长度(即包含‘\0’)!!!!
这下,你应该就能明白strlen和sizeof的区别了吧。
五.arr与&arr
前面的太简单?接下来看这道题。
请问以下代码在屏幕上输出什么?
#include<stdio.h>int main()
{int a[5] = { 1,2,3,4,5 };printf("%d ", *a);printf("%d ", *(int*)(&a));printf("%d ", *(a + 1));printf("%d ", *(int*)(&a+1));
}
答案:
1 1 2 随机数
解答:
要想知道为什么我们首先来看前两个printf语句:
printf("%d ", *a); //打印a地址处的内容
printf("%d ", *(int*)(&a)); //打印&a地址处的内容
这两者看起来似乎是没有区别,那我们来试着打印这两个地方的地址就知道是否一样了:
#include<stdio.h>int main()
{int a[5] = { 1,2,3,4,5 };printf("%p\n", a);// %p打印地址,就如同%d是打印整数一样的printf("%p ", (int*)(&a));
}
输出:
00DEFB24
00DEFB24
看起来好像就是一个地址的嘛,但为什么当两者的地址都+1后输出截然不同呢,是笔者的代码出错了吗?其实不是:
在c语言中数组名a表示首元素地址,而取地址数组名&a表示整个数组地址。
当a的地址+1后就指向了数组的第二个元素即2,但当&a的地址+1后就指向了数组的最后即一个未开辟的未知空间,因此解引用后也就得到了一个随机数。这也是为什么需要将&a的地址强制转换为(int*)的类型,不然编译器根本不会把他当作一个int的类型输出。
----------------------------------- 复习题-----------------------------------------
#include<stdio.h>
#include<string.h>
int main()
{int input = 1;char arr[] = "abcdefg";switch (input){case 1:printf("%d ", sizeof(arr));printf("%d ", strlen(arr));case 2:printf("%c ", *(int*)&arr);printf("%c ", *(int*)(&arr + 1));printf("%c ", *arr);printf("%c ", *(arr + 3));break;default:printf("%d ", 100);}
}
答案:
8 7 a 随机值 a d
答错了请再回去仔细看看哦!
总结
希望大家看了有所收获,总共5分,你得到了几分呢?如果你全部答对了,可以在评论区打出简单,以激励我写出更”难“的题来考验大家
【咬文嚼字】c语言中你可能不知道的小知识相关推荐
- C语言你不得不知道的小知识
C语言你不得不知道的小知识: 1: 常见的变量修饰关键字:static.const.extern.volatile.register static:(该变量保存在全局静态区) a.修饰局部变量--& ...
- 一些你我所不知道的小知识
一.老师没教的事 a.人类全身上下,最强韧有力的肌肉,竟是舌头. b.张开眼睛打喷嚏是不可能的. c.憋气自杀也是不可能成功的. d.每一次你舔一张邮票的背胶,你就吸收了十分之一卡路里. e.右撇子平 ...
- android动画能超过父容器吗,Android中你不得不知道的动画知识 (一)
动画基础 在日常开发中,我们往往不是仅仅局限于实现产品相应的功能就可以了,为了达到更好的用户体验我们还会加入一些比较好看的动画效果.今天我就来总结一下动画相关的一些知识. Android系统提供了很多 ...
- mysql时间字段中又t和z怎么处理_Mysql 中现在仍旧不知道的小知识点
重点: 表结构的增删改: alter table t_students add id int; alter table t_students drop id; alter table t_studen ...
- 你可能不知道的小知识-bug为什么叫bug
学了这么长时间的计算机,敲了很多行的代码,当然也很熟悉bug这个单词了.今天就来聊聊bug的来历. (bug就是指是bai指电脑系统du的硬件.系统软件(如操作系统)或应用软件zhi(如文字处理软件) ...
- 程序员常用编程工具: VS Code,那些你不得不知道的小知识!
工欲善其事,必先利其器.这句话真好,一句话可以写两篇文章.上一篇我们介绍了键盘,对于程序员来说,光有键盘可不行,你还需要一个趁手的编程工具.就像很多工程师对 HHKB 键盘情有独钟一样,好的编程工具可 ...
- 如何减小电压跟随器输出电阻_补课贴 | 关于运算放大器和比较器的异同,那些你不得不知道的小知识!...
在直入正题讲解运算放大器的异同之前,小A先来帮助大家简单回顾一下运算放大器和比较器的基础知识: 比较器是一种带有反相和同相两个输入端以及一个输出端的器件,该输出端的输出电压范围一般在供电的轨到轨之间. ...
- Java初学者非常容易忽视或者不知道的小知识
Q. 为什么 -0/3 结果是 0,而 -0.0/3.0 结果是 -0.0?(注意后边的结果0带负号) A. 在Java里,整数是用补码表示的.在补码中0只有一种表示方法.另一方面,浮点数则是用 IE ...
- 净水器哪种好?不得不知道的小知识
净水器哪种好想必是很多购买净水器的小伙伴纠结的问题,作为一个有相关经验的人来说,我总结了以下几点. 一.净水器的种类 首先净水器是根据过滤膜来分类的,现在市场上的净水器由微滤.超滤.RO反渗透.纳滤和 ...
最新文章
- html5中text-align,text-align
- Runloop循环机制
- 把随机数对象暴露给window成为全局对象 原型及原型链 原型的指向是否可以改变
- 《c#编程语言详解》,C#编程语言详解(第2版)
- ES5(一)——保护对象
- centos6使用bacula备份系统
- 计算机组成原理课后答案(唐朔飞第三版) 第四章
- Monkey基本命令
- 【C51单片机】数码管实现99秒倒计时
- java 开根号_Java实现开根号运算(不使用数组和String)
- 考个ISTQB证书有用吗
- excel计算机求和函数,多条件求和、多条件计数、多条件查找……多了去了!
- 一组数据,带你读懂“2021中国民营企业500强”背后深意
- LAPACK使用中出现问题的解决方案(VS平台下的)
- js获取PC设备信息,js获取手机设备信息,最全
- 踩坑!穿山甲广告Android SDK接入
- 从零基础到斩获BAT算法岗offer,围观复旦大佬的秋招之路
- 使用深山红叶工具盘备份瘫痪服务器的数据
- eclipse绿色版
- 如何证明地球是圆的呢