什么是c语言里面的跳转类语句

什么是c语言里面的跳转类语句,第1张

c语言跳转语句包括四种:goto,continue,break和return。
goto 标记,goto语句是无条件转移语句,且标记必须在当前函数中定义,使用“标记:”的格式定义。程序将跳到标记处继续运行。由于goto(特别是向回 goto 和长距离的 goto)容易产生阅读上的困难,所以对新手应该尽量少用。GCC 编译器拓展支持对指针 goto和宏内 goto,一定程度上增强了 goto 的可读性。
continue语句用在循环语句中,作用是结束当前一轮的循环,马上开始下一轮循环。
break语句用在循环语句或switch中,作用是结束当前循环,跳到循环体外继续运行。但是使用break只能跳出一层循环。在要跳出多重循环时,可以使用goto使得程序更为简洁。
当一个函数运行结束后要返回一个值时,使用return。return可以跟一个表达式或变量。如果return后面没有值,将运行不返回值。

//外部中断函数1 置flag1=1
//外部中断函数2 置flag2=1
void main( void )
{
while( 1 )
{
if( flag1 == 1 ) acquire1( );
if( flag2 == 1 ) acquire2( );
}
}
void acquire1( void )
{
//初始化1
while( 1 )
{
//采集1
if( flag2 == 1 ) break; // 退出循环而返回
}
}
void acquire2( void )
{
//初始化2
while( 1 )
{
//采集2
if( flag1 == 1 ) break; // 退出循环而返回
}
}

添加conioh文件头,然后调用getch函数等待用户输入。
例如:
#include <stdioh>
#include <conioh>
int main(int argc, char argv[])
{
char c;
c=getch();
switch(c){
case '1':
puts("用户输入了1\n");
break;
case '2':
puts("用户输入了2\n");
break;
default:
puts("用户输入错误\n");
}

return 0;
}

C语言只能跳转到函数如后,不能调到某段程序,C语言不是汇编,因为涉及到出栈入栈,跳转到一个入口的位置,而且函数指针必须有类型(涉及到参数传递和现场保护设置),随便跳转,因为程序没有正确出入栈,程序肯定就崩了(就算你拿一个错误的函数指针类型去调用也会出现不可预知的错误)。。。
不过C语言有俩函数确实可以实现这个功能,estjmph 但不常用,方法是有两个函数setjmp longjmp,setjmp设置跳转位置,会得到一个结构体变量jmp_buf,当你想跳转到这里可以调用 longjmp,以jmp_buf做参数即可跳转到该位置。。。
我从来没用过。。。。这种跳转的必要性不大,因为一般你不需要这样,就算是汇编程序也是分块的,跳转位置也是固定那么几个,你也不能随便跳转,一样会出问题。。。。

具体方法如下:
1
void (theUboot)(void);
theUboot = (void ()(void))(0x30700000);
theUboot();
2
((void ()(void))(0x30700000))();

额,你这个问题有点纠结
你可以想象下函数间的跳转。。。
函数的调用是一个压栈和d栈的过程,假如以在函数间随意跳转,而不返回的话,那么就是不停的压栈,而不d栈,而调转到另一函数的堆栈区间也将被破坏,这样就会产生一些不确定的诡异错误,我想这个你是可以想象的到的
但是你说想无条件跳转,那么函数间的跳转时不现实的,只能嵌套。
我推荐的方法是使用状态机,在单片机的while中档函数返回后判断当前状态决定下一个执行的函数。这种方法在程序设计中很常用
但是你假如是在想实现那种无条件跳转,其实也是可以的,不过需要使用C的宏来代替函数
比如有这样个函数
void set_val(int a , int val)
{
a = val;
}
void main()//对于单片机main的返回没啥意义
{
int a = 0;
while(1)
{
set_val(&a, 1);
}
}
可以改成这样
#define set_val( a , val)\
a = val;\
goto jump;\
void main()//对于单片机main的返回没啥意义
{
int a = 0;
while(1)
{
jump:
set_val(a, 1);
}
}
用宏而不适用函数这样基本可以满足你的需要,就是任意跳转,不过这种结构我十分不推荐。。。
这个程序我都没调试过,不过意思是这个意思
你可能汇编写的比较多,对C语言了解可能不多,我以前写单片机的时候也是用C写的,没啥实现不了的功能,慢慢你就习惯了哈

得用一个特殊的库,记得以前写过密码输入界面显示‘’,不过现在忘了,太生僻,用的不多
今天又研究了一下密码输入,看这段程序可以满足你的需求不:
#include <stdioh>
#include <stdlibh>
#include <conioh>
void main()
{
char operate = 0;
operate = getch();
switch(operate)
{
case '1':
printf("1XXXXX\n");
break;
case '2':
printf("2XXXXX\n");
break;
default:
break;
}
}

为什么要用指定的内存地址执行程序。
当然,c语言被编译连接后肯定都是一条一条的指令。也肯定是存在内存中的。
那么如果你是想跳到其他的程序的指令。那么你的需求是有用的。
可是,很不幸。这样的话, *** 作系统是不允许的,会报异常的。属于内存越界错误,很明显你创建的程序是无法访问其他程序的指令的。
其次,如果你只是想跳到本身的c语言的某条指令的话。使用goto语句就可以实现。虽然是不鼓励的。其次,规范好你的算法实现。用循环和判断完全能够实现。如果那条指令是汇编编写的程序的话。你也可以在c中嵌套汇编语言,jump到该指令。如果是汇编有关的话,跳转指令应该经常会用的吧。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存