精华内容
下载资源
问答
  • c语言switch型别强制转换的问题。以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!c语言switch型别强制转换的问题。语言规定,switch的引数必须是整型...

    c语言switch型别强制转换的问题。以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    59e3db23eb6d2da752c03653b623507a.png

    c语言switch型别强制转换的问题。

    语言规定,switch的引数必须是整型,或者字元。你定义的score是float型别,所以不加int强制转换会报错

    C语言强制转换的问题!

    你好! 一步一步来 int a,b; 这句的功能是作业系统为 变数a,b分别分配一块空闲的储存空间 以后使用a,b将相当于访问各自所对应的 储存空间 a = 0000;b = Ox1234; 这句的功能是 把0000放到变数a所对应的储存空间 把0x1234放到变数b所对应的储存空间 重点是下面这句a = (char)(b) 它的功能相当于修改变数a的值, 具体是这样操作的,从b所对应的储存空间中取出 b的值即0x1234,然后把他转换成char型别,再然后将 转换后的结果放到变数a所对应的储存空间,即覆蓋掉 原来的0000 这个转换后的结果又是多少呢,是这样算的 通常在C中int型别占4个位元组 而char型别占1个位元组 如果把一个int型别的资料以char型别输出,那么,编译器 会自动丢弃int型别的前3个位元组的内容 对应本题 int型别的资料b是0X1234 为十六进位制 在计算机中是这样储存的 0000 0000 0000 0000 0001 0010 0011 0100共4个位元组 转换成char型别后,前3个位元组丢弃 即结果是0011 0100 共1个位元组 对应的十进位制是52 当语句a = (char)(b)执行完后 这1个位元组的值也就是52就放到了变数a所对应的储存空间, 而不是原来的0000了 所以,整个过程并没有改变变数a和b的资料型别 原来是int型别现在还是int型,程式只是修改了变数a 的值,连b的值都没有修改,因为修改a的值时只是从b所 对应的储存空间里把b的值取出来用一用,用的结果是修改成 char型别,但他把修改后的结果放到a所对应的储存空间了, 并没有放到b所对应的储存空间,所以原来b所对应的值没有被 覆蓋,原来是0X1234,现在还是0X1234 仅供参考!呵呵

    (rData+3*((long)tmpRawData0-1024l ))/10l );

    就是 rData + (3*(tempRawData0-1024)) /10

    后边的l是长整形的意思,

    *和/是同等优先顺序的运算子,按从左到右计算。

    tempRawData0先减去1024然后乘以3,再除以10,再加上rData

    C语言强制型别转换的问题。

    强制型别转换不是printf语句预设的动作,正确的是这样的:

    printf("%d\n",(int)a);

    否则如果写printf("%d\n",a);则printf不会做强制资料型别转换的。

    c语言强制型别转换的问题

    1,假设 float x=0.0; int y=5; 当然这样的假设不合理,不建议真正程式设计中使用

    则,x = (float)y; 这是C中的强制型别转换,是没有编译错误的,但有没有逻辑错误得看你

    程式码的上下文

    2,至于num(float);

    可以这么告诉你,这是个函式,并且只有一个引数,该引数型别为float。

    对于强制型别转换来说,永远都是将表示式的右值(=右边的部分)强转(人为的)成符合左值(=左边的部分)的型别。

    有关C语言强制转换的问题

    无法解释

    你什么编译器啊?

    我用g

    验证程式

    int main()

    {

    volatile int a=0;

    volatile float b=0.14;

    a= (int) (b *1000);

    printf("%d\n",a);

    }

    输出

    140

    C语言中强制转换的问题

    强制转换是“取整”,不进行“四舍五入”,也就是取不大于被强制的资料的最大(绝对值)整数!

    一个C语言强制转换的问题

    你用的编译环境可能是TC吧!这样的编译器预设int型为两个位元组即16个二进位制位,对有符型int来说二进位制位最高位表示符号,“0”为正、“1”为负。

    又数在记忆体中是以其补码形式存在,正数补码为其本身,如二进位制数101011在记忆体中的表示为0 0000000 00101011,第一个0表示此数为正数,后面为其补码;负数的补码为其反码+1 ,如-100110,先将其改写为-0000000 00100110,(由最高位为符号站不管它,先看资料位即后15位)取反得1111111 11011001(先不管符号)在+1得1111111 11011010 在将符号位写上1 1111111 11011010 这样-100110的补码即在计算机记忆体中存放的形式就表现出来了1 1111111 11011010 。

    对(int)m=1 00000000 00000000,由于其是十七为数,在存放时将最高位1舍去了在记忆体中被储存为0 0000000 00000000 就是正数0。

    再看(int)n=11111111 11111111 它其实是-1在计算机中的补码,但我们知道计算机在输出时是将其变为原码输出的,故执行结果就是(0,-1)。

    为了避免此种情况或得到表示范围更广的整数,建议使用VC编译器,因为其整形资料在记忆体中占4位元组。

    C++型别强制转换的问题

    这个是因为每个汉字占了2个位元组,当然用中文输入法输入的符号也占2个位元组,且每个位元组里所存的ASCII值(这里说ASCII值不太准确)均为负值,你写的程式是只要输入流里有东西,就会回圈一次,即读入再输出。¥的2个ASCII值分别为-93和-92,第一次读入了-93,输出一次,然后第二次执行到cin时,又把-92读入,再输出,所以就有2个值了

    C语言 关于强制转换的问题

    int open()

    FILE *fopen()

    你弄混啦

    分页:123

    展开全文
  • switch语句switch语句有几种特别的使用情况:可以联系多个选项...本质上说,switch的所有功能都可被条件分支if-else语句所表达,那么既然有等价表示方式,为何要定义switch语法呢?首先,要从switch语句机器指令的实...

    1995ebdf41a6c833cdacab0d73dc8f4c.png

    switch语句

    • switch语句有几种特别的使用情况:
    1. 可以联系多个选项。如5、6的处理方式相同
    2. 可以实现落下,即实现语句块的穿越。如2没有break语句,因而执行完2会继续执行3

    0aaf385b29f051210fd74062908c768c.png
    • 在C语言中,switch选项必须为整数类型,不支持其他类型。
    • 本质上说,switch的所有功能都可被条件分支if-else语句所表达,那么既然有等价表示方式,为何要定义switch语法呢?

    e1f3922bebd6195691772f225217ecfd.png
    1. 首先,要从switch语句机器指令的实现方式来讲。switch语句通过跳转表这种数据结构实现机器指令。跳转表是一个数组,其中每一个元素都是地址,指向对应case语句块的起始地址。switch语句工作时,根据x变量值,到跳转表中查到对应的元素,即case语句块的目标地址,然后执行跳转语句,跳转到真正目标入口的起始位置上。
    2. 这种实现方式,致使switch语句相比if-else有很大优势,因为switch语句不管跳转到哪个语句块,花费的时间是固定的,即时间复杂度为常数类型。而if-else如执行第n个语句块时,必须先做前n个语句块的判断,时间复杂度不固定。所以说,switch语句利用跳转表,将时间复杂度转换为了常数
    3. 这种实现方式,也决定了变量必须为整数。因为只有整数才能对数组下标进行查找操作

    switch的机器指令实现

    进入switch语句前,在汇编级别上做的准备工作

    • 首先传入用于判断的变量X,存在rdi寄存器中
    • 用ja指令排除掉小于0和大于6的数。ja指令用于无符号数大于的判断,尽管x为有符号数,也会被当做无符号数判断,若x为负数,会被ja当做最高位为1的正数,故而用ja指令可排除掉小于0和大于6的数
    • jmp间接跳转

    b1c994f72efc06b5f5ac5c6d4214753c.png
    1. 何为间接跳转?跳转语句有两种分类方式,一种分为无条件跳转和有条件跳转;另一种则根据跳转目标,分为直接跳转和间接跳转。跳转目标是确定位置为直接跳转;跳转目标需要基于某个变量计算出来的,为间接跳转
    2. jmp间接跳转指令的操作数是一个寻址方式的四元组。其中:
    • L4是跳转表的起始地址。跳转表是编译器编译时生成的一组固定只读数据,一共有7个。编译器在内存中分配出一个不可被修改的区域,其起始地址标号为L4,每个数据宽度为8字节,对应数据值称为标签,标签实质为一个地址,标签地址就是跳转代码块的地址。
    • rdi是跳转表中要查找数据的下标,8代表每个元素大小,*表示把地址中数据取出来(上图中为L3),作为跳转语句的目标地址
    • 由于跳转表只有7个元素,所以switch最多只支持0到6范围的变化,小于0或大于6会调到默认位置,即default(也解释了ja语句的作用)

    switch语句实例分析

    • 下图为跳转表与case语句块的对应关系

    0b0548266405e0155942ff7d80bb864c.png
    • 对2、3落下的理解:

    db6798d85c6f68c2c9e8ca420480478a.png

    把w赋值为1,是在进入switch语句块时进行,因为并非所有语句块都需对w赋值操作(如2),如果在switch语句块前就对w赋值的话,会浪费指令,导致性能下降。而先检查哪个语句块需要赋值,再按需赋值,尽管会稍稍增加代码量,但大大加快效率

    对switch的进一步探讨

    • 查找表(跳转表)实现switch语句有性能提升,但本身仍具有一定局限性。当case语句的值较大时,若仍然以0为起始地址,查找表规模会很大,且大部分地址实际上都指向default,这些地址的存储毫无意义。
    • 两种解决方法:
    1. 当case语句取址密集时,可认为是从0地址的一个整体偏移。此时只需要编译器减去一个固定偏移量,就可使case语句的值处于较小区间内。

    b90e52077aa0f7a1db928ca48f083995.png
    1. 当case数据范围很大,且在数轴上不密集时,就不适宜用查找表方式实现。此时我们使用二分搜索查找对应语句块。

    3ce086a2a5e2e4373802edf70c294a38.png

    关注公众号,让我们携手共进

    c7e2ab2b2091836eea8a18e2e00e1217.png
    展开全文
  • 先说switch case陷阱 #include<iostream> using namespace std; int main(int argc, char *argv[]) { int a =0; switch(a) { case 0: int b=1;cout<<b<<endl;break; ...

    先说switch case陷阱

    #include<iostream>
    using namespace std;
    
    
    int main(int argc, char *argv[])
    {
        int a =0;
        switch(a)
        {
            case 0: int b=1;cout<<b<<endl;break;
            case 1: cout<<b<<endl;break;
            default:break;
        }
        return 0;
    }

      在gcc或者g++编译器下编译的结果为:

      提示跳过了变量b的初始化过程。对于一个局部变量,它的作用域为它所定义的地方到它所在的语句块结束为止,那么对于变量b,它所在的最小语句块为switch{}块,那么也就说在case 0后面的部分,变量b都是可见的(注意在case 0之前变量b是无法访问的)。考虑这样一种情况,当a的值为1,那么程序就跳到case 1执行,此时b虽然可以访问,但是跳过了它的初始化过程。而如果在定义变量的同时进行了初始化,表明程序员希望初始化这个变量,但是此时跳过了该变量的初始化,就可能导致程序出现程序员无法意料的情况,因此编译器为了避免跳过这样的初始化而造成无法预料的结果,就对该语句进行报错

      如果将上述代码改为:

     switch(a)
        {
            case 0: int b;b=0;cout<<b<<endl;break;
            case 1: cout<<b<<endl;break;
            default: break;
        }

    不会报错,编译会有warming提示变量b没有初始化。

    再看下面这段代码:

     switch(a)
        {
            case 0: break;
            default: int b=1;cout<<b<<endl;break;
        }

      这段代码没有报错。因为如果执行case 0,变量b没有进行初始化,但是由于在case 0部分b是不可见的,因此不会对程序造成任何影响,而如果执行default分支,则b会被初始化,因此程序没有报错。此程序不会跳过初始化,所以不会报错。

     

    变量作用域:

    作用域:是指变量作用的范围;

    局部变量和静态局部变量,其作用域为定义处到所在代码块结束(一个{}表示一个代码块)。

    全局变量:作用域为定义处到所在源文件结束,但是可以使用extern关键字来扩充其作用域(可以在其他源文件使用)。当使用static关键字修饰时,将其作用域限定在其所在源文件,这样和其他源文件中同名变量不会冲突。(用static修饰的全局变量成为静态全局变量)。

    生存期

    全局变量(包括静态全局变量),静态局部变量都是从定义处开始到程序结束。

    普通局部变量,从定义处开始到该语句块结束。

     

     

    展开全文
  • C语言 switch和if..else的区别 以及枚举的作用 1.分支结构的两种形式:if/else 和 switch/case 2.两者简单的区别:前者是两个分支的选择,后者是多分支选择,各有各的使用场景。其实如果switch能实现的,if也能...

    C语言 switch和if..else的区别   以及枚举的作用

    1.分支结构的两种形式:if/else 和 switch/case

    2.两者简单的区别:前者是两个分支的选择,后者是多分支选择,各有各的使用场景。其实如果switch能实现的,if也能实现,但是要级联很多层,代码的可读性比较差,不易维护,switch本身就是分支选择,而且结构很清晰

    3.下面有它们两个详细的区别,大家不用去纠结这点,了解一下即可

    switch...case与if...else的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的。从而,switch...case不用像if...else那样遍历条件分支直到命中条件,而只需访问对应索引号的表项从而到达定位分支的目的。
    具体地说,switch...case会生成一份大小(表项数)为最大case常量+1的跳表,程序首先判断switch变量是否大于最大case 常量,若大于,则跳到default分支处理;否则取得索引号为switch变量大小的跳表项的地址(即跳表的起始地址+表项大小*索引号),程序接着跳到此地址执行,到此完成了分支的跳转。具体代码如下:

    用gcc编译器,生成汇编代码
     .file "shiyan.c"
     .text
    .globl main
     .type main, @function
    main:
     leal 4(%esp), %ecx
     andl $-16, %esp
     pushl -4(%ecx)
     pushl %ebp
     movl %esp, %ebp
     pushl %ecx
     subl $20, %esp
     movl $3, -8(%ebp)
     cmpl $4, -8(%ebp)
     ja .L2
     movl -8(%ebp), %eax
     sall $2, %eax
     movl .L8(%eax), %eax
     jmp *%eax
     .section .rodata
     .align 4
     .align 4
    .L8:
     .long .L3
     .long .L4
     .long .L5
     .long .L6
     .long .L7
     .text
    .L3:
     movl $0, -12(%ebp)
     jmp .L11
    .L4:
     movl $1, -12(%ebp)
     jmp .L11
    .L5:
     movl $2, -12(%ebp)
     jmp .L11
    .L6:
     movl $3, -12(%ebp)
     jmp .L11
    .L7:
     movl $4, -12(%ebp)
     jmp .L11
    .L2:
     movl $10, -12(%ebp)
    .L11:
     addl $20, %esp
     popl %ecx
     popl %ebp
     leal -4(%ecx), %esp
     ret
     .size main, .-main
     .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3"
     .section .note.GNU-stack,"",@progbits

    由以上看来,

    switch有点以空间换时间的意思,而事实上也的确如此。
    1.当分支较多时,当时用switch的效率是很高的。因为switch是随机访问的,就是确定了选择值之后直接跳转到那个特定的分支,但是if。。else是遍历所以得可能值,知道找到符合条件的分支。如此看来,switch的效率确实比ifelse要高的多。
    2.由上面的汇编代码可知道,switch...case占用较多的代码空间,因为它要生成跳表,特别是当case常量分布范围很大但实际有效值又比较少的情况,switch...case的空间利用率将变得很低。
    3.switch...case只能处理case为常量的情况,对非常量的情况是无能为力的。例如 if (a > 1 && a < 100),是无法使用switch...case来处理的。所以,switch只能是在常量选择分支时比ifelse效率高,但是ifelse能应用于更多的场合,ifelse比较灵活。

    由此看来,上面的中断处理程序中用switch是比较合适的,即节省了时间,而且对于以后程序的扩展也是很方便。因为报文类型这个值基本上都是用整形常量来表示的。


    枚举类型:在一定程度上,是对布尔类型的一个扩展,因为BOOL类型只有YES 和 NO两种取值,有时候就不够用了。另一方面:提高代码的可读性,也就是把人类更容易理解的标识符和数字形成简单的对应。。在你们后期做项目和开发过程中switch通常会和枚举值配合使用,表达式是枚举值的变量,case是枚举值,可读性更高。。。


    展开全文
  • switch语句可以用…来判断范围,要注意其边界条件(且为包含),其表达方式如下 switch(x) { case 0...99: //等价于 0&lt;=x &amp;&amp; x&lt;=99; xxxxxx; xxxxxx; break; ...
  • c语言实现用switch大致判断范围

    千次阅读 2018-04-30 12:39:35
    因为c中switch语句中的case语句后要求后跟实值表达式,所以switch无法直接通过某个范围来进行选择,而使用if语句嵌套又显得有些臃肿。所以作为初学者的我权且想了一个替代的方法以实现。以判断二次函数是否有实根且...
  • C语言 switch和if..else的区别 以及枚举的作用1.分支结构的两种形式:if/else 和 switch/case2.两者简单的区别:前者是两个分支的选择,后者是多分支选择,各有各的使用场景。其实如果switch能实现的,if也能实现,...
  • 按照本题,所列出的范围是10W到100W,除以10W正好能得到这样一个结果:利用10个数达到表示范围的目的。 所以让利润除以10W。但是只是除以10W不能达到目的,举例来说,当利润刚好是10W的时候,本身该是第一档,结果...
  • 临近国庆,小学期兴趣选修课结课时有一位朋友做C语言的结课作业时遇到了困难请教我,话不多说,先把题目贴上来: 程序设计题:薪水是上班族最关心的问题,对于即将步入社会的我们也同样重要,毕业后找到一份高薪的...
  • C语言switch语句报错问题

    千次阅读 2018-04-18 15:16:56
    C中使用case语句报出的一个错误原创 2016年02月23日 14:04:49314使用C或C++时,switch--case语句编译器报出这样一个错误:首先看一下代码:[cpp] view plain copycase 4: int len=ListLength(L); printf(&...
  • C语言

    万次阅读 多人点赞 2019-12-18 23:01:50
    C语言 42.C语言是一种计算机高级语言。 43.C语言允许直接访问物理地址,能进行位操作。 44.C语言是结构化程序设计语言 45.c程序要通过编译,连接才能得到可执行的目标程序 46.用c语言编写程序,可以编写出任何类型的...
  • 我看到一些答主说要用...两边加空格,而且要用gcc编译,我不太懂,我试着写了但是我的编译器直接报错了,有什么办法用switch case表示范围吗,我用的是visual studio2010。
  • C语言基础:switch语句

    2018-03-12 10:45:19
    switch语句可以算是if else语句的一种特殊情况。当我们使用if else语句来做判断时,如果我们只想对条件表达式的结果做一些特定值的判断,那么就可以使用switch语句。例如:我们需要根据当前月份来判断这个月份应该有...
  • 今天上课讲了switch语句,我个人不是很懂,附上c语言代码 #include int main() { int n=-1; switch(n) { case -2: n++; break; case 2: n--; break; case 4: n+=2; break; case 5: n+=2; break; case 6: n+=2; ...
  • 时间紧促,粗糙记录一下! 一: case 1: int a; break; case 2: ...像一那样在case里面直接定义变量时,编译器一般是会报错的,应该改为如下,以表示是在{}的范围内有效的变量 case 1: { int
  • 江苏省计算机二级C语言试题,考试大纲,笔试,上机,素材,很全面。C语言考试要求1.C语言的基本概念。(1)源程序的格式、风格和结构,main函数及其他函数的基本概念。(2)基本算术类型数据的表示及使用。①类型标识符(int...
  • 如题2010年江苏省计算机等级考试二级C语言考试大纲C语言考试要求C语言的基本概念。(1)源程序的格式、风格和结构,main函数及其他函数的基本概念。(2)基本算术类型数据的表示及使用。①类型标识符(int,float,double...
  • C语言题库

    万次阅读 多人点赞 2019-07-01 16:14:45
    1.(A)是构成C语言程序的基本单位。 A、函数B、过程C、子程序D、子例程 2.C语言程序从C开始执行。 A) 程序中第一条可执行语句 B) 程序中第一个函数 C) 程序中的main函数 D) 包含文件中的第一个函数 3、以下...
  • C语言中有两种选择语句:if语句和switch语句。  if语句  一般形式如下:  if(表达式)  语句1  else  语句2  表达的意思是:如果表达式的结果为真,则执行语句1,否则执行语句2。  if语句中...
  • 表示范围 case 0...4; // error case 5 ... 9; // ok eg 1: char ch = 4; switch(ch) {  case 1: printf(" into 1\n");break;  case 3 ... 8: printf( " into 2 to 8\n");break; } o...
  • 【C/C++】C语言特性总结

    万次阅读 多人点赞 2019-08-10 16:21:28
    已经有大约半年的时间没有碰C语言了,当时学习的时候记录了很多的笔记,但是都是特别混乱,后悔那个时候,...文章目录工具gcc编译器VS2019C语言编译过程C语言代码主体必要内容C语言数据类型关键字常量变量进制表示s...
  • 华为C语言编程规范(精华总结)

    万次阅读 多人点赞 2020-03-24 09:48:55
    2、头文件 对于C语言来说,头文件的设计体现了大部分的系统设计。 不合理的头文件布局是编译时间过长的根因,不合理的头文件实际上反映了不合理的设计。 1、头文件中适合放置接口的声明,不适合放置实现 头文件是...
  • C语言中,case后不可直接跟多个常量,要如下图所示使用(不要忘记defalut) switch(int,char){ case 1: ...ST语言中,OF后可以用逗号直接将常量隔开,也可以使用省略号表示常量的范围。 ```CASE is...
  • C语言基础知识梳理总结

    万次阅读 多人点赞 2017-03-06 09:54:48
    C语言是当代人学习及生活中的必备基础知识,应用十分广泛,下面为大家带来C语言基础知识梳理总结,C语言零基础入门绝对不是天方夜谭!
  • C语言 C语言基础

    千次阅读 多人点赞 2018-11-18 19:42:02
    C语言 C语言基础 一、简述 对于C语言基础相关方面的表面理解,简单介绍。 二、二进制 生活中常用的是十进制,基数0,1,2,3,4,5,6,7,8,9,。满10进1。 时钟60进制。基数0,1,2...57,58,59。满60进1。60秒为1分钟...
  • 用来实现如图所示表示的多分支选择结构语句。 switch语句的一般形式如下: switch(表达式) { case 常量1:语句1 case 常量2:语句2 . . . . . . case 常量n:语句n default : 语句n+1 } 说明: (1)switch后面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,922
精华内容 7,968
关键字:

c语言switch表示范围

c语言 订阅