且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

【No.6 switch的陷阱】

更新时间:2022-10-04 15:09:51

==【注意】==
程序语言只是我们与计算机交流并让计算机实现我们创造性思想的工具,可以并鼓励深入掌握一门语言,但千万别沉迷于钻某种语言的牛角尖,一定要把握好二者间的度

本帖属不定时连载贴,以试卷的形式提出一个比较基础的问题供大家思考讨论,问题的解析将在下一更新贴中一并给出,这样做是希望还不清楚问题的朋友有自己思考和讨论的时间,希望大家能从这些帖子中有所收获。

贴中问题属我在学习C\C++过程中遇到的一些语法或者比较隐晦的程序问题,其中有自己的总结,也不乏网络上搜索到的经典解析,在此分享给大家,希望能起到抛砖引玉的作用

我已认真检查过自己的帖子,但难免有疏忽,如大家在阅读过程中仍发现有问题,请及时通知,我会及时更正,以免误导大家,万分感谢^_^



【No.6  switch的陷阱】

由于连载形式,每帖第二部分都配有上一问题的解答。为了保持帖子的针对性和一致性,此贴仅供交流讨论本次问题若大家对上一问题有任何疑问,请通过解答末尾的传送链接前往该问题贴回复讨论

[问题No.6]
请写出以下代码的执行结果
复制内容到剪贴板
代码:
#include<iostream>
int main(int argc, char **argv)
{
  using namespace std;

  int x = 0;
  int i = 1;

  switch(i)
  {
    case 1: x = 5;
    case 2: ++x;
    case 3: ++x;
    default : x = 0;
  }

  cout<<x<<endl;
  return EXIT_SUCCESS;
}



No.5 类型转换导致的错误
输出结果
1
2
2
1


问题浅析
解决此题的关键在于无符号数与有符号数的比较以及数值的溢出问题,当有无符号数与有符号数同时存在于一条语句中时,有符号数总是被转换成无符号数后再与无符号数进行计算。


复制内容到剪贴板
代码:
char GetChar(int x, int y)
{
  char c;
  unsigned int a = x; 
  (a + y > 10) ? (c=1) : (c=2);  //此处的y首先被转换为无符号数,再与a求和,最后结果与10进行比较
  return c;
}

//假设机器内int、unsigned int型变量大小为一个字节(8位,便于解释)

char c1 = GetChar(7,4);
    //x == 7,y == 4,y在机器内部的补码表示为0000 0100
    //a + y == 0000 0111
    //       + 0000 0100
    //       -------------
    //         0000 1011 == 11 > 10 故执行语句(c=1),函数返回1

char c2 = GetChar(7,3);
    //x == 7,y == 3,y在机器内部的补码表示为0000 0011
    //a + y == 0000 0111
    //       + 0000 0011
    //       -------------
    //         0000 1010 == 10 不大于 10 故执行语句(c=2),函数返回2

char c3 = GetChar(7,-7);
    //x == 7,y == -7,y在机器内部的补码表示为1111 1001
    //a + y == 0000 0111
    //       + 1111 1001
    //       -------------
    //      (1)0000 0000 == 0 < 10 故执行语句(c=2),函数返回2
    //       |
    //       此位溢出
char c4 = GetChar(7,-8);
    //x == 7,y == -8,y在机器内部的补码表示为1111 0111
    //a + y == 0000 0111
    //       + 1111 0111
    //       -------------
    //         1111 1110 == 254 > 10 故执行语句(c=1),函数返回1
     本文转自Bill_Hoo 51CTO博客,原文链接:http://blog.51cto.com/billhoo/733261,如需转载请自行联系原作者