如何在switch case中定义变量

如何在switch case中定义变量,第1张

switch是我们做条件选择时,经常用到的一个语句。一直以来对于他的使用相信大家也都是得心应手,前几天在linux下写一个c++程序时遇到了这样的一个问题,请看例子:

#include<iostream>

using namespace std

int main()

{

int i

cout<<"please input the value of i ---(0-9)"<<endl

cin >>i

switch(i)

{

case 0:

int j = 3

cout <<j <<endl

break

case 4:

case 1:

case 2:

break

}

return 0

}

不知道大家看出这个程序问题在什么地方没有,一开始我是没有感觉有什么不对的地方,后来编译的时候就出现了问题:

testswitch.cpp:14:8: 错误: 跳转至 case 标号 [-fpermissive]

testswitch.cpp:11:8: 错误: 跳过了‘int j’的初始化

testswitch.cpp:15:8: 错误: 跳转至 case 标号 [-fpermissive]

testswitch.cpp:11:8: 错误: 跳过了‘int j’的初始化

testswitch.cpp:16:8: 错误: 跳转至 case 标号 [-fpermissive]

testswitch.cpp:11:8: 错误: 跳过了‘int j’的初始化

大致的意思是,系统不允许我们在case中定义一个变量,原因是我们在一个case中定义的变量,假如在另一个case中被使用就会出现错误,因为一般来说switch语句中的case只能被执行一个。

但是我们假如是想要定义一个在case中使用的临时变量,那该怎么办呢。当然是有办法的其实也很简单就是我们在写case语句时给每一个case加一个大括号就行了。例如程序假如如下写就没有问题:

(c语言中的报错是:标号只能是语句的一部分,而声明并非语句。)

#include<iostream>

using namespace std

int main()

{

int i

cout<<"please input the value of i ---(0-9)"<<endl

cin >>i

switch(i)

{

case 0:

{

int j = 3

cout <<j <<endl

break

}

case 4:

case 1:

case 2:

break

}

return 0

}

之所以加大括号就是为了明确我们声明的变量的作用域,就是仅仅在本case之中。

对此问题的分析:

由于switch的几个case语句在同一个作用域(因为case 语句只是标签,它们共属于一个swtich语句块),所以如果在某个case下面声明变量的话,其他的case语句也能看到,这样的话就可能导致错误,例如在地一段代码中的case 1后面还有个case 2的话,且case 2中使用了case 1定义的变量i的话,那么如果运行时n = 2,switch直接跳转到case2内部,这样就出现了i没有初始化的事情了(变量的声明是在编译阶段,而变量的赋值则是在运行时),如果能够运行的话,则在case 2中,i的初始值将是一个未知值。所以编译器直接避免这种事情的发生,就让其编译无法通过。而很明显加上花括号之后,i的作用域就很明确了。

当然这里我们提到的问题,并不是每个编译器都会存在。我试验过java之中就不存在这样的问题,我们可以随意在case中声明变量,因为java之中已经明确规定了case中变量的作用域。这可能是c++编译器设计上的一个小小的不足吧!这里拿出来跟大家分享一下,希望对大家有点用处吧

获取服务器mac 复制代码 代码如下: <?php /** 获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址 **/ class GetmacAddr{ var $result = array()// 返回带有MAC地址的字串数组 var $macAddr/*构造*/ function __construct($osType){ switch ( strtolower($osType) ){ case "unix": breakcase "solaris": breakcase "aix": breakcase "linux": { $this->for_linux_os()}breakdefault: { $this->for_windows_os()}break} $temp_array = array()foreach($this->result as $value){ if(preg_match("/[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f][:-]"."[0-9a-f][0-9a-f]/i",$value, $temp_array ) ){ $this->macAddr = $temp_array[0]break} } unset($temp_array)return $this->macAddr} /*linux系统中获取方法*/ function for_linux_os(){ @exec("ifconfig -a", $this->result)return $this->result} /*win系统中的获取方法*/ function for_windows_os(){ @exec("ipconfig /all", $this->result)if ( $this->result ) { return $this->result} else { $ipconfig = $_SERVER["WINDIR"]."\system32\ipconfig.exe"if(is_file($ipconfig)) { @exec($ipconfig." /all", $this->result)} else { @exec($_SERVER["WINDIR"]."\system\ipconfig.exe /all", $this->result)return $this->result} } } } ?> 获取客户端mac地址: 复制代码 代码如下: @exec("arp -a",$array)//执行arp -a命令,结果放到数组$array中 foreach($array as $value){ //匹配结果放到数组$mac_array if(strpos($value,$_SERVER["REMOTE_ADDR"]) &&preg_match("/(:?[0-9A-F]{2}[:-]){5}[0-9A-F]{2}/i",$value,$mac_array)){ $mac = $mac_array[0]break} } echo $mac 注:客户端获取的mac不能在本机测试,只能用别的电脑访问才能输出


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7473647.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存