goto 订阅
其中标号需要申请,在对应的过程的申请的位置写label <标号>;其中,标号必须为byte型整数。在该段落内还需要有<标号>:表示将要转向的方向。 展开全文
其中标号需要申请,在对应的过程的申请的位置写label <标号>;其中,标号必须为byte型整数。在该段落内还需要有<标号>:表示将要转向的方向。
信息
中文名
Goto
外文名
Goto
应用语言
C,C#,Pascal等
Goto应用举例
Sample:(2005MSDN上的例子)#include int main(){int i, j;for ( i = 0; i < 10; i++ ){printf( "Outer loop executing. i = %d\n", i );for ( j = 0; j < 3; j++ ){printf( " Inner loop executing. j = %d\n", j );if ( i == 5 )goto stop;}}/* This message does not print: */printf( "Loop exited. i = %d\n", i );stop: printf( "Jumped to stop. i = %d\n", i );//stop: 就是标签return 0;}goto <标号>;其中标号需要申请,在对应的过程的申请的位置写label <标号>;其中,标号必须为byte型整数。在该段落内还需要有<标号>:表示将要转向的方向。
收起全文
精华内容
下载资源
问答
  • goto
    千次阅读
    2021-03-05 23:12:09

    语法 - Java中是否有goto语句?

    我对此感到困惑。 我们大多数人都被告知Java中没有任何goto语句。

    但我发现它是Java中的关键词之一。 哪里可以使用? 如果它不能使用,那么为什么它作为关键字包含在Java中呢?

    23个解决方案

    222 votes

    防止人们被迅猛龙杀死。

    237ac88a689bfabed3e1edf4f3d32b30.png

    Alceu Costa answered 2019-02-28T00:14:45Z

    210 votes

    James Gosling在支持goto语句的情况下创建了原始JVM,但随后他将此功能删除为不必要的。 goto不必要的主要原因是通常可以用更易读的语句(如break/continue)或通过将一段代码提取到方法中来替换它。

    资料来源:James Gosling,Q&amp; A会议

    Vitalii Fedorenko answered 2019-02-28T00:15:18Z

    178 votes

    Java关键字列表指定goto关键字,但标记为“未使用”。

    它是在原始的JVM中(见@VitaliiFedorenko的回答),但随后删除了。 它可能保留为保留关键字,以防它被添加到更高版本的Java中。

    如果列表中没有goto,并且稍后会将其添加到该语言中,则使用单词goto作为标识符(变量名,方法名等等)的现有代码将会中断。 但是因为goto是一个关键字,这样的代码甚至不会在当前编译,并且仍然可以使它实际上稍后执行某些操作,而不会破坏现有代码。

    Thomas answered 2019-02-28T00:14:20Z

    137 votes

    关键字存在,但未实现。

    我能想到的唯一使用goto的理由是:

    for (int i = 0; i < MAX_I; i++) {

    for (int j = 0; j < MAX_J; j++) {

    // do stuff

    goto outsideloops; // to break out of both loops

    }

    }

    outsideloops:

    在Java中,你可以这样做:

    loops:

    for (int i = 0; i < MAX_I; i++) {

    for (int j = 0; j < MAX_J; j++) {

    // do stuff

    break loops;

    }

    }

    jonnystoten answered 2019-02-28T00:15:57Z

    43 votes

    [http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html]

    “关键字const和goto是   保留,即使他们不是   目前使用。“

    Isaac E answered 2019-02-28T00:16:29Z

    28 votes

    因此,如果语言设计者感到需要,他们可以在某一天使用。

    此外,如果来自具有这些关键字的语言(例如C,C ++)的程序员错误地使用它们,那么Java编译器可以提供有用的错误消息。

    或者也许只是为了阻止程序员使用goto :)

    dave answered 2019-02-28T00:17:09Z

    19 votes

    它们保留供将来使用(请参阅:Java语言关键字)

    关键字const和goto是保留的,即使它们当前未被使用。

    Java中没有goto语句的原因可以在“Java语言环境”中找到:

    Java没有goto语句。 研究表明,goto(错误)的使用频率高于“因为它存在”。 消除goto导致语言的简化 - 例如,没有关于goto对for语句中间的影响的规则。 对大约100,000行C代码的研究确定,大约90%的goto语句纯粹用于获得打破嵌套循环的效果。 如上所述,多级中断并继续删除对goto语句的大部分需求。

    Heinzi answered 2019-02-28T00:17:57Z

    17 votes

    如何在Java中使用“continue”标签的示例是:

    public class Label {

    public static void main(String[] args) {

    int temp = 0;

    out: // label

    for (int i = 0; i < 3; ++i) {

    System.out.println("I am here");

    for (int j = 0; j < 20; ++j) {

    if(temp==0) {

    System.out.println("j: " + j);

    if (j == 1) {

    temp = j;

    continue out; // goto label "out"

    }

    }

    }

    }

    System.out.println("temp = " + temp);

    }

    }

    结果:

    I am here // i=0

    j: 0

    j: 1

    I am here // i=1

    I am here // i=2

    temp = 1

    andrew answered 2019-02-28T00:18:24Z

    10 votes

    重要的是要理解goto构造是程序员用机器代码和汇编语言编程的日子。 因为这些语言是如此基本(例如,每个指令只做一件事),程序控制流程完全用goto语句完成(但在汇编语言中,这些被称为跳转或分支指令)。

    现在,虽然C语言相当低级,但它可以被认为是非常高级的汇编语言 - C中的每个语句和函数都可以很容易地分解为汇编语言指令。 尽管C不是当今计算机编程的主要语言,但它仍然在低级应用程序中大量使用,例如嵌入式系统。 因为C的函数如此紧密地反映了汇编语言的功能,所以只有goto包含在C中才有意义。

    很明显,Java是C / C ++的演变。 Java与C共享许多功能,但是抽象了更多的细节,因此只是以不同的方式编写。 Java是一种非常高级的语言,因此当更多高级结构(如函数,for,for和while循环)执行程序控制流时,它不需要像goto那样具有低级功能。 想象一下,如果你在一个函数中,并将goto标记到另一个函数中。 当其他函数返回时会发生什么? 这个想法很荒谬。

    这并不一定能解释为什么Java包含goto语句但不会让它编译,但重要的是要知道为什么goto首先被用在较低级别的应用程序中,以及为什么它只是没有意义 在Java中使用。

    Michael P at NCSU answered 2019-02-28T00:19:13Z

    10 votes

    不,goto未使用,但您可以定义标签并将循环保留到标签。 您可以使用break或continue,后跟标签。 所以你可以跳出多个循环级别。 看看教程。

    Arne Burmeister answered 2019-02-28T00:19:40Z

    8 votes

    不,谢天谢地,Java中没有goto。

    goto关键字仅保留,但未使用(const也是如此)。

    Bozho answered 2019-02-28T00:20:14Z

    7 votes

    因为它不受支持,为什么你想要一个什么都不做的break label;关键字或一个名为continue label;的变量?

    虽然您可以使用break label;和continue label;语句来有效地执行goto所做的事情。 但我不推荐它。

    public static void main(String [] args) {

    boolean t = true;

    first: {

    second: {

    third: {

    System.out.println("Before the break");

    if (t) {

    break second;

    }

    System.out.println("Not executed");

    }

    System.out.println("Not executed - end of second block");

    }

    System.out.println("End of third block");

    }

    }

    pjp answered 2019-02-28T00:20:51Z

    6 votes

    不,goto在Java中没有使用,尽管它是一个保留字。 对于const也是如此。这两个都在C ++中使用,这可能是它们被保留的原因; 其目的可能是避免让迁移到Java的C ++程序员感到困惑,也许还要保留在Java的后续版本中使用它们的选项。

    Michael Borgwardt answered 2019-02-28T00:21:19Z

    2 votes

    正如所指出的那样,Java中没有goto,但关键字是保留的,以防Sun感觉有一天会向Java添加goto。 他们希望能够在不破坏太多代码的情况下添加它,因此他们保留了关键字。 请注意,在Java 5中,他们添加了goto关键字,并且它也没有破坏那么多代码。

    虽然Java没有goto,但它有一些构造对应于goto的一些用法,即能够break和continue具有命名循环。 另外,finally可以被认为是一种扭曲的goto。

    Thomas Pornin answered 2019-02-28T00:21:59Z

    1 votes

    禁止声明具有相同名称的变量。

    例如int i = 0, goto;

    Karl answered 2019-02-28T00:22:36Z

    1 votes

    它被认为是你不做的事情之一,但可能被列为保留字,以避免混淆开发人员。

    Dean J answered 2019-02-28T00:23:07Z

    1 votes

    [http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.goto]

    如果你被告知Java中没有goto语句你就被愚弄了。 实际上,Java包含两层“源”代码。

    Mikael Lindlöf answered 2019-02-28T00:23:44Z

    1 votes

    请注意,您可以替换goto的大部分良性用法

    返回

    打破

    打破标签

    扔进了try-catch-finally

    starblue answered 2019-02-28T00:24:36Z

    1 votes

    请参阅以下链接,显示所有java保留字,并告诉您它们添加的版本。

    [http://java.sun.com/docs/books/tutorial/java/nutsandbolts/_keywords.html]

    goto是保留的,即使它当前没有使用,也绝不会说永远不会:)

    Paul Whelan answered 2019-02-28T00:25:21Z

    1 votes

    我也不是goto的粉丝,因为它通常会使代码的可读性降低。 但是我确实相信该规则有例外(特别是当词法分析器和解析器时!)

    当然,您可以将程序转换为类似汇编程序的程序,然后编写类似的东西,将程序带入Kleene Normalform

    int line = 1;

    boolean running = true;

    while(running)

    {

    switch(line++)

    {

    case 1: /* line 1 */

    break;

    case 2: /* line 2 */

    break;

    ...

    case 42: line = 1337; // goto 1337

    break;

    ...

    default: running = false;

    break;

    }

    }

    (所以你基本上写一个执行你的二进制代码的VM ...其中goto对应于指令指针)

    这比使用goto的代码更具可读性,不是吗?

    Viktor Engelmann answered 2019-02-28T00:26:12Z

    0 votes

    因为虽然Java语言不使用它,但JVM字节码可以。

    gribnit answered 2019-02-28T00:26:43Z

    0 votes

    当然它是关键字,但它不用于源代码级别。

    但是如果你使用jasmin或其他低级语言,它转换为字节码,那么“goto”就在那里

    user1722245 answered 2019-02-28T00:27:21Z

    -3 votes

    goto不是Java

    你必须使用GOTO但它无法正常工作。在关键的java字中它没有被使用。[http://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html]

    public static void main(String[] args) {

    GOTO me;

    //code;

    me:

    //code;

    }

    }

    m-tech answered 2019-02-28T00:27:58Z

    更多相关内容
  • shell goto_Linux goto shell实用程序简介

    千次阅读 2020-07-14 02:52:49
    shell goto goto shell实用程序允许用户导航到别名目录,并且还支持自动完成。 这个怎么运作 在使用goto之前,您需要注册目录别名。 例如: goto -r dev / home / iridakos / development 然后转到该目录,...

    shell goto

    goto shell实用程序允许用户导航到别名目录,并且还支持自动完成。

    这个怎么运作

    在使用goto之前,您需要注册目录别名。 例如:

     goto -r dev / home / iridakos / development 
    

    然后转到该目录,例如:

     goto dev 
    
    goto demo

    goto中的自动补全

    goto带有一个不错的自动完成脚本-每当在goto命令后按Tab键时,Bash或Zsh都会提示您有关可用别名的建议:

    
       
    $ goto < tab >
    bc / etc / bash_completion.d                    
    dev / home / iridakos / development
    rubies / home / iridakos / .rvm / rubies

    安装goto

    有几种安装goto的方法。

    通过脚本

    克隆存储库并以超级用户或root身份运行安装脚本:

    
       
    git clone https: // github.com / iridakos / goto.git
    cd goto
    sudo . / install

    手动地

    在复制文件系统文件goto.sh的地方,并在您的.zshrc中添加一行或.bashrc中源吧。

    例如,如果将文件放在主文件夹中,则只需将以下行添加到.zshrc.bashrc文件中:

     source ~ / goto.sh 
    

    MacOS自制软件

    MacOS中的Bash Shell提供了一个名为goto的公式:

     brew install goto 
    

    添加彩色输出

     echo -e " \$ include /etc/inputrc \n set colored-completion-prefix on" >> ~ / .inputrc 
    

    笔记:

    • 安装后需要重新启动外壳。
    • 您需要在MacOS中为Bash启用Bash完成功能(请参阅本期 )。
      • 如果未启用它,则可以使用brew install bash-completion安装它。

    goto的使用方法

    切换到别名目录

    要更改为别名目录,请键入:

     goto < alias > 
    

    例如:

     goto dev 
    

    注册别名

    要注册目录别名,请键入:

     goto -r < alias > < directory > 
    

    要么

     goto --register < alias > < directory > 
    

    例如:

     goto -r blog / mnt / external / projects / html / blog 
    

    要么

     goto --register blog / mnt / external / projects / html / blog 
    

    笔记:

    • goto 会扩展目录,因此您可以使用以下命令轻松为当前目录添加别名,该目录将自动别名为整个路径:
       goto -r last_release . 
      
    • 别名后按Tab键可提供Shell的默认目录建议。

    取消注册别名

    要注销别名,请使用:

     goto -u < alias > 
    

    要么

     goto --unregister < alias > 
    

    例如:

     goto -u last_release 
    

    要么

     goto --unregister last_release 
    

    注意:在命令( -u--unregister )后按Tab键,完成脚本将提示您输入已注册别名的列表。

    列出别名

    要获取您当前注册的别名的列表,请使用:

     goto -l 
    

    要么

     goto --list 
    

    扩展别名

    要将别名扩展为其值,请使用:

     goto -x < alias > 
    

    要么

     goto --expand < alias > 
    

    例如:

     goto -x last_release 
    

    要么

     goto --expand last_release 
    

    清理别名

    要从文件系统中不再可访问的目录中清除别名,请使用:

     goto -c 
    

    要么

     goto --cleanup 
    

    得到帮助

    要查看该工具的帮助信息,请使用:

     goto -h 
    

    要么

     goto --help 
    

    检查版本

    要查看工具的版本,请使用:

     goto -v 
    

    要么

     goto --version 
    

    在更改目录之前先推送

    要在更改目录之前将当前目录推送到目录堆栈中,请键入:

     goto -p < alias > 
    

    要么

     goto --push < alias > 
    

    恢复到推送目录

    要返回推送目录,请输入:

     goto -o 
    

    要么

     goto --pop 
    

    注意:此命令等效于popd,但在goto命令中。

    故障排除

    如果看到未找到错误命令: Zsh中的compdef ,则意味着您需要加载bashcompinit 。 为此,请将其附加到您的.zshrc文件中:

    
       
    autoload bashcompinit
    bashcompinit

    参与其中

    goto工具是根据MIT许可条款开放的源代码,欢迎您提供帮助。 要了解更多信息,请访问goto的GitHub存储库中的Contributing部分。

    转到脚本

    
       
    goto()
    {
      local target
      _goto_resolve_db

      if [ -z "$1" ]; then
        # display usage and exit when no args
        _goto_usage
        return
      fi

      subcommand="$1"
      shift
      case "$subcommand" in
        -c|--cleanup)
          _goto_cleanup "$@"
          ;;
        -r|--register) # Register an alias
          _goto_register_alias "$@"
          ;;
        -u|--unregister) # Unregister an alias
          _goto_unregister_alias "$@"
          ;;
        -p|--push) # Push the current directory onto the pushd stack, then goto
          _goto_directory_push "$@"
          ;;
        -o|--pop) # Pop the top directory off of the pushd stack, then change that directory
          _goto_directory_pop
          ;;
        -l|--list)
          _goto_list_aliases
          ;;
        -x|--expand) # Expand an alias
          _goto_expand_alias "$@"
          ;;
        -h|--help)
          _goto_usage
          ;;
        -v|--version)
          _goto_version
          ;;
        *)
          _goto_directory "$subcommand"
          ;;
      esac
      return $?
    }

    _goto_resolve_db()
    {
      GOTO_DB="${GOTO_DB:-$HOME/.goto}"
      touch -a "$GOTO_DB"
    }

    _goto_usage()
    {
      cat <<\USAGE
    usage: goto [<option>] <alias> [<directory>]

    default usage:
      goto <alias> - changes to the directory registered for the given alias

    OPTIONS:
      -r, --register: registers an alias
        goto -r|--register <alias> <directory>
      -u, --unregister: unregisters an alias
        goto -u|--unregister <alias>
      -p, --push: pushes the current directory onto the stack, then performs goto
        goto -p|--push <alias>
      -o, --pop: pops the top directory from the stack, then changes to that directory
        goto -o|--pop
      -l, --list: lists aliases
        goto -l|--list
      -x, --expand: expands an alias
        goto -x|--expand <alias>
      -c, --cleanup: cleans up non existent directory aliases
        goto -c|--cleanup
      -h, --help: prints this help
        goto -h|--help
      -v, --version: displays the version of the goto script
        goto -v|--version
    USAGE
    }

    # Displays version
    _goto_version()
    {
      echo "goto version 1.2.4.1"
    }

    # Expands directory.
    # Helpful for ~, ., .. paths
    _goto_expand_directory()
    {
      builtin cd "$1" 2>/dev/null && pwd
    }

    # Lists registered aliases.
    _goto_list_aliases()
    {
      local IFS=$' '
      if [ -f "$GOTO_DB" ]; then
        while read -r name directory; do
          printf '\e[1;36m%20s  \e[0m%s\n' "$name" "$directory"
        done < "$GOTO_DB"
      else
        echo "You haven't configured any directory aliases yet."
      fi
    }

    # Expands a registered alias.
    _goto_expand_alias()
    {
      if [ "$#" -ne "1" ]; then
        _goto_error "usage: goto -x|--expand <alias>"
        return
      fi

      local resolved

      resolved=$(_goto_find_alias_directory "$1")
      if [ -z "$resolved" ]; then
        _goto_error "alias '$1' does not exist"
        return
      fi

      echo "$resolved"
    }

    # Lists duplicate directory aliases
    _goto_find_duplicate()
    {
      local duplicates=

      duplicates=$(sed -n 's:[^ ]* '"$1"'$:&:p' "$GOTO_DB" 2>/dev/null)
      echo "$duplicates"
    }

    # Registers and alias.
    _goto_register_alias()
    {
      if [ "$#" -ne "2" ]; then
        _goto_error "usage: goto -r|--register <alias> <directory>"
        return 1
      fi

      if ! [[ $1 =~ ^[[:alnum:]]+[a-zA-Z0-9_-]*$ ]]; then
        _goto_error "invalid alias - can start with letters or digits followed by letters, digits, hyphens or underscores"
        return 1
      fi

      local resolved
      resolved=$(_goto_find_alias_directory "$1")

      if [ -n "$resolved" ]; then
        _goto_error "alias '$1' exists"
        return 1
      fi

      local directory
      directory=$(_goto_expand_directory "$2")
      if [ -z "$directory" ]; then
        _goto_error "failed to register '$1' to '$2' - can't cd to directory"
        return 1
      fi

      local duplicate
      duplicate=$(_goto_find_duplicate "$directory")
      if [ -n "$duplicate" ]; then
        _goto_warning "duplicate alias(es) found: \\n$duplicate"
      fi

      # Append entry to file.
      echo "$1 $directory" >> "$GOTO_DB"
      echo "Alias '$1' registered successfully."
    }

    # Unregisters the given alias.
    _goto_unregister_alias()
    {
      if [ "$#" -ne "1" ]; then
        _goto_error "usage: goto -u|--unregister <alias>"
        return 1
      fi

      local resolved
      resolved=$(_goto_find_alias_directory "$1")
      if [ -z "$resolved" ]; then
        _goto_error "alias '$1' does not exist"
        return 1
      fi

      # shellcheck disable=SC2034
      local readonly GOTO_DB_TMP="$HOME/.goto_"
      # Delete entry from file.
      sed "/^$1 /d" "$GOTO_DB" > "$GOTO_DB_TMP" && mv "$GOTO_DB_TMP" "$GOTO_DB"
      echo "Alias '$1' unregistered successfully."
    }

    # Pushes the current directory onto the stack, then goto
    _goto_directory_push()
    {
      if [ "$#" -ne "1" ]; then
        _goto_error "usage: goto -p|--push <alias>"
        return
      fi

      { pushd . || return; } 1>/dev/null 2>&1

      _goto_directory "$@"
    }

    # Pops the top directory from the stack, then goto
    _goto_directory_pop()
    {
      { popd || return; } 1>/dev/null 2>&1
    }

    # Unregisters aliases whose directories no longer exist.
    _goto_cleanup()
    {
      if ! [ -f "$GOTO_DB" ]; then
        return
      fi

      while IFS= read -r i && [ -n "$i" ]; do
        echo "Cleaning up: $i"
        _goto_unregister_alias "$i"
      done <<< "$(awk '{al=$1; $1=""; dir=substr($0,2);
                        system("[ ! -d \"" dir "\" ] && echo " al)}' "$GOTO_DB")"
    }

    # Changes to the given alias' directory
    _goto_directory()
    {
      local target

      target=$(_goto_resolve_alias "$1") || return 1

      builtin cd "$target" 2> /dev/null || \
        { _goto_error "Failed to goto '$target'" && return 1; }
    }

    # Fetches the alias directory.
    _goto_find_alias_directory()
    {
      local resolved

      resolved=$(sed -n "s/^$1 \\(.*\\)/\\1/p" "$GOTO_DB" 2>/dev/null)
      echo "$resolved"
    }

    # Displays the given error.
    # Used for common error output.
    _goto_error()
    {
      (>&2 echo -e "goto error: $1")
    }

    # Displays the given warning.
    # Used for common warning output.
    _goto_warning()
    {
      (>&2 echo -e "goto warning: $1")
    }

    # Displays entries with aliases starting as the given one.
    _goto_print_similar()
    {
      local similar

      similar=$(sed -n "/^$1[^ ]* .*/p" "$GOTO_DB" 2>/dev/null)
      if [ -n "$similar" ]; then
        (>&2 echo "Did you mean:")
        (>&2 column -t <<< "$similar")
      fi
    }

    # Fetches alias directory, errors if it doesn't exist.
    _goto_resolve_alias()
    {
      local resolved

      resolved=$(_goto_find_alias_directory "$1")

      if [ -z "$resolved" ]; then
        _goto_error "unregistered alias $1"
        _goto_print_similar "$1"
        return 1
      else
        echo "${resolved}"
      fi
    }

    # Completes the goto function with the available commands
    _complete_goto_commands()
    {
      local IFS=$' \t\n'

      # shellcheck disable=SC2207
      COMPREPLY=($(compgen -W "-r --register -u --unregister -p --push -o --pop -l --list -x --expand -c --cleanup -v --version" -- "$1"))
    }

    # Completes the goto function with the available aliases
    _complete_goto_aliases()
    {
      local IFS=$'\n' matches
      _goto_resolve_db

      # shellcheck disable=SC2207
      matches=($(sed -n "/^$1/p" "$GOTO_DB" 2>/dev/null))

      if [ "${#matches[@]}" -eq "1" ]; then
        # remove the filenames attribute from the completion method
        compopt +o filenames 2>/dev/null

        # if you find only one alias don't append the directory
        COMPREPLY=("${matches[0]// *}")
      else
        for i in "${!matches[@]}"; do
          # remove the filenames attribute from the completion method
          compopt +o filenames 2>/dev/null

          if ! [[ $(uname -s) =~ Darwin* ]]; then
            matches[$i]=$(printf '%*s' "-$COLUMNS" "${matches[$i]}")

            COMPREPLY+=("$(compgen -W "${matches[$i]}")")
          else
            COMPREPLY+=("${matches[$i]// */}")
          fi
        done
      fi
    }

    # Bash programmable completion for the goto function
    _complete_goto_bash()
    {
      local cur="${COMP_WORDS[$COMP_CWORD]}" prev

      if [ "$COMP_CWORD" -eq "1" ]; then
        # if we are on the first argument
        if [[ $cur == -* ]]; then
          # and starts like a command, prompt commands
          _complete_goto_commands "$cur"
        else
          # and doesn't start as a command, prompt aliases
          _complete_goto_aliases "$cur"
        fi
      elif [ "$COMP_CWORD" -eq "2" ]; then
        # if we are on the second argument
        prev="${COMP_WORDS[1]}"

        if [[ $prev = "-u" ]] || [[ $prev = "--unregister" ]]; then
          # prompt with aliases if user tries to unregister one
          _complete_goto_aliases "$cur"
        elif [[ $prev = "-x" ]] || [[ $prev = "--expand" ]]; then
          # prompt with aliases if user tries to expand one
          _complete_goto_aliases "$cur"
        elif [[ $prev = "-p" ]] || [[ $prev = "--push" ]]; then
          # prompt with aliases only if user tries to push
          _complete_goto_aliases "$cur"
        fi
      elif [ "$COMP_CWORD" -eq "3" ]; then
        # if we are on the third argument
        prev="${COMP_WORDS[1]}"

        if [[ $prev = "-r" ]] || [[ $prev = "--register" ]]; then
          # prompt with directories only if user tries to register an alias
          local IFS=$' \t\n'

          # shellcheck disable=SC2207
          COMPREPLY=($(compgen -d -- "$cur"))
        fi
      fi
    }

    # Zsh programmable completion for the goto function
    _complete_goto_zsh()
    {
      local all_aliases=()
      while IFS= read -r line; do
        all_aliases+=("$line")
      done <<< "$(sed -e 's/ /:/g' ~/.goto 2>/dev/null)"

      local state
      local -a options=(
        '(1)'{-r,--register}'[registers an alias]:register:->register'
        '(- 1 2)'{-u,--unregister}'[unregisters an alias]:unregister:->unregister'
        '(: -)'{-l,--list}'[lists aliases]'
        '(*)'{-c,--cleanup}'[cleans up non existent directory aliases]'
        '(1 2)'{-x,--expand}'[expands an alias]:expand:->aliases'
        '(1 2)'{-p,--push}'[pushes the current directory onto the stack, then performs goto]:push:->aliases'
        '(*)'{-o,--pop}'[pops the top directory from stack, then changes to that directory]'
        '(: -)'{-h,--help}'[prints this help]'
        '(* -)'{-v,--version}'[displays the version of the goto script]'
      )

      _arguments -C \
        "${options[@]}" \
        '1:alias:->aliases' \
        '2:dir:_files' \
      && ret=0

      case ${state} in
        (aliases)
          _describe -t aliases 'goto aliases:' all_aliases && ret=0
        ;;
        (unregister)
          _describe -t aliases 'unregister alias:' all_aliases && ret=0
        ;;
      esac
      return $ret
    }

    goto_aliases=($(alias | sed -n "s/.*\s\(.*\)='goto'/\1/p"))
    goto_aliases+=("goto")

    for i in "${goto_aliases[@]}"
            do
                    # Register the goto completions.
            if [ -n "${BASH_VERSION}" ]; then
              if ! [[ $(uname -s) =~ Darwin* ]]; then
                complete -o filenames -F _complete_goto_bash $i
              else
                complete -F _complete_goto_bash $i
              fi
            elif [ -n "${ZSH_VERSION}" ]; then
              compdef _complete_goto_zsh $i
            else
              echo "Unsupported shell."
              exit 1
            fi
    done


    它最初在转到的GitHub存储库中以自述文件的形式发布,并在获得许可的情况下被重用。

    翻译自: https://opensource.com/article/20/1/directories-autocomplete-linux

    shell goto

    展开全文
  • 关键字goto在C语言中的使用

    千次阅读 2021-05-18 17:20:30
    1、goto关键字基础知识关键字goto从字面的意思就是"去哪里"的意思,专业一点的话表示无条件跳转的意思(有学过汇编的小伙伴应该会觉得非常像jump指令),在C语言中的使用格式是:goto label,表示跳转到label的位置,...

    1、goto关键字基础知识关键字goto从字面的意思就是"去哪里"的意思,专业一点的话表示无条件跳转的意思(有学过汇编的小伙伴应该会觉得非常像jump指令),在C语言中的使用格式是:goto label,表示跳转到label的位置,并且我们的label一般都写在语句的开头,写成label:的形式。(下面一个小例子来简单介绍用法)

    intmain(intargc,char*argv[]){

    //无条件跳转到标签处

    gotothelastBug;

    printf("未知bug\n");

    //标签定义

    thelastBug:

    printf("最后一个bug\n");

    return0;

    }

    注意点:

    1)goto label;后面的分号一定得打。(个人经常忘记,这里提醒一下各位)

    2)goto只能在函数内部无条件跳转,不能从一个函数跳转到另外一个函数。

    3)label:的标识在使用goto语句的前后均可,不遵循先定义后使用。

    4)label的作用域在函数内部,不同函数之间可以定义相同的label。

    (上面的几点注意项大家有时间可以在电脑上实验下)

    2、备受争议的C语言关键字-goto

    对于goto的使用程序语言界算是争议不断,并且大部分大学C语言老师在讲到到goto这关键字的时候一般都会叫大家慎用goto关键字,甚至有部分老师一棍子拍死“禁止使用goto关键字”。个人觉得一棍子打死终究不合适,慎用比较说得过去点。如果说禁止使用那为什么还要在C语言标准中定义呢?干脆直接剔除算了。有句话说得好,"存在即合理"。

    我们在高中学习算法的时候应该画过基本的结构图,三大基本的程序结构分别是:顺序结构、分支结构和重复结构,这个三种结构就能够创造出所有的逻辑结构,那么我们C语言就是顺序执行的表示顺序结构;if、switch等表示分支结构;while、for等结构表示的是重复结构。可以说我们不用goto语句也能编写出我们想要实现的程序。

    那么我们换一种思考方式,我们的重复结构就比如说三个循环语句for、while、do...while,在我的实践编程经验来看他们都可拆成:一个分支语句+goto语句,下面我举一个if+goto实现for语句的例子供大家参考:

    /**********************************

    * Fucion: main

    * Descri: if+goto 模拟for语句

    **********************************/

    intmain(intargc,char*argv[]){

    //循环变量定义

    inti=0;

    i=0;

    Loop:if(i>5){gotoLoopEnd;}i++;

    //for(i= 0;i<5;i++)

    //{

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

    gotoLoop;

    //}

    LoopEnd:

    printf("最后一个bug\n");

    return0;

    }

    其他的重复语句也可以由分支+goto模拟,这里就不再书写代码了,只是说用模拟循环的方式似乎书写上不是很美观。所以我觉得并不是goto不好用,而是怕大家滥用,导致对程序的把控力的下降。

    那么我们再深入一点看待goto语句,我上面说了该关键字非常的灵活,其实goto本身的功能是非常简单的,就是一个跳转到所定义的标签label位置,灵活的地方在于label可以在一个函数内部每一句的开头都可以定义。

    所以我们要控制goto为我们所用主要就是控制label的使用问题,后面我们会有例子教大家怎么控制label,所以goto语句还是一个非常有潜力的关键字,对于设计巧妙高效的算法会非常有用!所以个人觉得只要对goto语句的使用加以管束为我们开发服务,这未尝不是一件好事。

    3、大佬都是这么用goto的!

    1)瞄一瞄linux中的goto

    我们读过linux相关代码的小伙伴会发现goto语句的使用无处不在,首先我截取了uboot1.1.6中的一部分代码来欣赏一下(毕竟uboot也是大佬写的):

    47ba926e09643bd4bb1bd8d8acea3974.gif

    微信å¾ç_20200624095511.png (36.16 KB, 下载次数: 0)

    2020-6-24 09:55 上传

    47ba926e09643bd4bb1bd8d8acea3974.gif

    微信å¾ç_20200624095515.png (29.15 KB, 下载次数: 1)

    2020-6-24 09:55 上传

    第一张是一个函数的前半部分,第二张为该函数末尾,中间代码还有非常多这样的语句。程序大体的意思是:打开一个文件,然后对该文件一系列操作,一旦操作不成功就会goto到error标签,然后关掉该文件,否则如果都执行成功了就会return 1.表示成功。

    没错,这是goto常用的一种用法就是处理多种异常情况,这样带来的好处是高效,为什么这么说呢?有些小伙伴就就会问题了,我直接在每个错误处理用return返回一个变量,然后再函数外面通过判断这个标志进行故障处理不就好了吗?

    个人觉得如果你有这样的想法是好的,不过在我们进行驱动编程的过程中还是要有一定的规范,如上面的代码我们在函数前面申请了mem_fb,既然没有使用成功我们就应该在该函数中直接释放它,这样能够对函数有更好的封装和隐秘性。那有些小伙伴又会说,分支语句每个分支里面进行处理就好了呀,这种处理方式会使得每个分支语句里面都有相同的释放处理语句,加大了程序。

    2)使用goto跳出多层循环

    我们都知道break仅仅只能跳出当前循环,如果遇到多层循环需要跳出的问题,就需要每个循环都需要break一下,并且还需要内层循环传递相关信号让外层循环break掉,从而退出多层循环,这样做实在有点麻烦,而且代码结构也不好看,那么有些小伙伴就会问那我直接return掉就好了,我们来看一下下面的代码你就会有自己的决定了:

    /**********************************

    * Fucion: main

    * Descri: goto跳出多层循环

    **********************************/

    intmain(intargc,char*argv[]){

    inti=0,j=0,k=0;

    for(i=0;i<10;i++)

    {

    for(j=0;j<10;j++)

    {

    for(k=0;k<10;k++)

    {

    //if(条件不满足)

    //goto ERROR;

    }

    //if(条件不满足)

    //goto ERROR;

    }

    //if(条件不满足)

    //goto ERROR;

    }

    return1;

    ERROR:

    //相关资源释放

    printf("最后一个bug\n");

    return0;

    }

    /**********************************

    * Fucion: main

    * Descri: return跳出多层循环

    **********************************/

    intmain(intargc,char*argv[]){

    inti=0,j=0,k=0;

    for(i=0;i<10;i++)

    {

    for(j=0;j<10;j++)

    {

    for(k=0;k<10;k++)

    {

    //if(条件不满足)

    //相关资源释放

    //return 0;

    }

    //if(条件不满足)

    //相关资源释放

    //return 0;

    }

    //if(条件不满足)

    //相关资源释放

    //return 0;

    }

    printf("最后一个bug\n");

    return1;

    }

    3)作者对goto关键字小结

    这里仅仅代码个人的使用观点:

    (1)上面两个例子中我们使用goto是可以借鉴的,对程序的效率和美观有一定的效果;

    (2)对于一般的程序goto语句的功能尽量简单,便于分析和代码的整洁,如果不能带来较大的优势还是尽量少用;

    (3)个人平时研究控制理论,对于任何事物觉得要么是发散、要么是收敛比较好分析处理问题,对于震荡问题相对比较麻烦,所以对于如下图2种goto的使用情景我是推荐的,前面说了只要我们控制好goto的灵活度就能够为我们服务,那么我们只需要规定在一个函数中其只是单向跳转,我们对程序的把控能力就大大提高了。

    47ba926e09643bd4bb1bd8d8acea3974.gif

    微信å¾ç_20200624095519.png (52.15 KB, 下载次数: 2)

    2020-6-24 09:55 上传

    4、总结

    好了,今天的内容就到这里吧,看完这个文章希望大家能够有点收获吧,也希望大家能帮忙传播传播

    展开全文
  • goto语句怎么用(c语言goto用法)

    千次阅读 2021-05-19 02:26:43
    goto语句怎么用(c语言goto用法)2020-07-28 02:03:29共10个回答1、C语言中goto又叫无条件转移语句,可以让程序直接跳转到任意标记的位置.用法就是“gotolabel……label:”.下面用一个示例来演示具体的用法,这里先新建...

    goto语句怎么用(c语言goto用法)

    2020-07-28 02:03:29

    共10个回答

    1、C语言中goto又叫无条件转移语句,可以让程序直接跳转到任意标记的位置.用法就是“gotolabel……label:”.下面用一个示例来演示具体的用法,这里先新建一个C语言的程序文件,演示使用的是VisualStudio软件作为开发工具:2、输入goto语句应用代码,这里先定义两个变量a和b,然后用printf函数打印两句话,直接用goto语句强制跳转到打印b语句的end标记位置,此时a的打印就不会执行了:3、编译执行程序,按下crtl+F5打开命令行,就可以看到执行的结果,打印出了b语句,和预期的结果一样.以上就是C语言中goto的用法:

    0ad0187cdeb5a5dfbb86102d555da828.png

    再er后面见上冒号即er:

    82e503f370ee2a32aba3233a9e5384d9.png

    goto无条件跳转,即只要程序在执行期间遇到goto关键字它将无条件执行goto所指向的标签处.所以说goto一定是跟标签一起使用的,标签的定义是:exit这就是一个标签(标签的定义是冒号紧跟着就是标示符).要跳转的话直接这样gotoexit

    947230bc291d341e6e3215a6f8be7338.png

    goto语句在c语言中不主张使用,可以用循环中加判断调用函数方式实现.goto简单的使用:main(){inta,b,c=0;loop:scanf("%d%d",&a,&b);if(a>b)gotoloop1;elsegotoloop;loop1:c=b;b=a;a=b;printf("a=%db=%d\n",a,b);

    823fb76ea881e6dff595a8469568a6f4.png

    goto语句以及用goto语句构成循环goto语句是一种无条件转移语句,与BASIC中的goto语句相似.goto语句的使用格式为:goto语句标号;其中标号是一个有效的标识符

    eaef1481139ddb3ded6a79fff71d3a0e.png

    这个其实和循环一样的作用,要和rem配合使用goto的意思跳到标记处rem是标记这样就可以形成一个死循环,上面的代码的意思就是无限啊a键.就是这样的谢谢采纳

    aa855e763b8257512c27a82a94394f09.png

    原则是尽量不用.只有在程序结构很清楚,或goto会使程序结构更清楚易懂,极端情况下会考虑效率问题.===============================gotolable;//要跳过的代码//(1)lable:.//(2)===============================程序会跳过(1),直接执行(2)

    da7a61043bb20d4e46086234f207bc19.png

    例子:#includeintmain(intargc,char*argv[]){inti=1;tt:printf("%d\n",i++);if(i<10)gotott;return0;}但是不推荐用goto,需要跳转到的前面加上xxx:即可,xxx自己随意定义望采纳.

    cf43c3eb8f2eeb053a9c56fbbc0080fd.png

    goto只能函数内部跳,当然不能跳到另一个函数或者跳到另一个C文件goto会破坏程序的结构性,所以能不用尽量别用.

    f1f3b450e8977b1c78a19801d44109b2.png

    很多人建议废除C++/C的goto语句,以绝后患.但实事求是地说,错误是程序员自己造成的,不是goto的过错.goto语句至少有一处可显神通,它能从多重循环体中咻地一下子跳到外面,用不着写很多次的break语句;例如{…{…{…gotoerror;}}}error:…就象楼房着火了,来不及从楼梯一级一级往下走,可从窗口跳出火坑.所以我们主张少用、慎用goto语句,而不是禁用.

    134223f5e957b86a79747be2b6c37b22.png

    展开全文
  • 如何在 Python 中实现 goto 语句

    千次阅读 2020-12-19 16:14:13
    Python 默认是没有 goto 语句的,但是有一个第三方库支持在 Python 里面实现类似于比如在下面这个例子里,from goto import with_goto@with_gotodef func():for i in range(2):for j in range(2):goto .endlabel ....
  • goto

    千次阅读 2019-07-28 22:23:00
    goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto 语句配合使用。 如: label...
  • 想了解基于python goto的正确用法说明的相关内容吗,追梦小狂魔在本文为您仔细讲解python goto用法的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:python,goto用法,下面大家一起来学习吧。首先是安装,...
  • goto语句

    千次阅读 2020-03-24 16:57:19
    goto语句 goto语句在C语言中可以实现无条件跳转,通过和if语句的有效组合也可以实现循环结构。 1、goto语句的标准形式 goto语句由关键字goto和一个代码中存在的标号名组成。标准形式如下所示:goto标号名; 其执行...
  • 如何在Python中实现goto语句的方法

    千次阅读 2020-12-04 06:03:18
    Python 默认是没有 goto 语句的,但是有一个第三方库支持在 Python 里面实现类似于goto ...比如在下面这个例子里,from goto import with_goto@with_gotodef func():for i in range(2):for j in range(2):goto .end...
  • C语言中goto的用法:

    千次阅读 多人点赞 2022-05-02 10:44:48
    前言 1.goto语句的缺点2.goto语句的结构:3.goto语句的用法:
  • 在python中怎么实现goto功能

    千次阅读 2020-12-17 23:00:41
    匿名用户1级2013-07-30 回答goto语句也称为无条件转移语句,其一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto...
  • 怎么在Python中实现goto语句的方法

    千次阅读 2021-01-13 23:56:25
    Python 默认是没有 goto 语句的,但是有一个第三方库支持在 Python 里面实现类似于goto ...比如在下面这个例子里,from goto import with_goto@with_gotodef func():for i in range(2):for j in range(2):goto .end...
  • C++中goto的使用

    千次阅读 2022-05-18 18:46:21
    这不中遇到最多的就是修改goto问题,可能是项目的需要吧,几乎每个c文件里都有好几个goto。 C语言中goto随意用,但C++中却是不行的,修改为cpp后最常见的编译错误如下图: C++中不允许跳过变量初始化,即goto...
  • 微擎 goto + 混淆加密, 反向解密思路

    千次阅读 2020-06-19 10:25:00
    微擎 goto + 混淆加密, 反向解密思路 写在前面(一堆废话着急请略过) defined("\x49\116\137\111\101") or exit("\x41\143\143\145\163\163\x20\x44\145\156\x69\x65\144"); class yzxcpt_sunModuleWxapp extends ...
  • php微擎Goto2C解密研究

    万次阅读 2020-04-26 00:55:01
    疫情期间,闲着没事,就研究了下被Goto打乱语法的PHP程序。 一、初写脚本 三天写了个初步脚本,发现解密的还是不太完整,对case、if等语句解密后与源代码有一定偏差。 本来想着应该用不到PHP-Parser进行处理的...
  • 这里写自定义目录标题PHP goto语句加密的解密全过程代码格式化总结 ...代码主体部分涉及的授权部分全部以goto语句写成了一个加密代码。如如下这段便是其中一小段代码: function zcode($string){$E4kA0=!defined("jlBc
  • c++关键字goto

    千次阅读 2019-02-12 10:32:34
    文章目录goto基本功能跳转跳出本次循环,功能类似continue goto c++最强大的关键字之一,它可以使程序跳转到指定位置继续运行。 还记得上c++的课老师说不要随意使用goto,原则上尽量避免使用goto。 理论上可以证明...
  • c语言中goto的用法

    千次阅读 2021-05-18 15:07:30
    goto语句是一种无条件转移语句,与BASIC中的goto语句相似。下面小编就跟你们详细介绍下c语言中goto的用法,希望对你们有用。c语言中goto的用法如下:goto 语句的使用格式为:goto 语句标号;其中标号是一个有效的...
  • C语言goto语句详解

    千次阅读 多人点赞 2021-04-14 15:35:52
    goto语句 我们先看一个代码: int main() { flag: printf("hehe\n"); printf("haha\n"); goto flag; return 0; } 这段代码我们会死循环的一直打印hehe haha,当程序看到flag:时,他不管,直接往下走,到达...
  • golang中的goto

    千次阅读 2021-01-20 21:40:25
    使用 goto 退出多层循环 下面这段代码在满足条件时,需要连续退出两层循环,使用传统的编码方式如下: package main import "fmt" func main() { var breakAgain bool // 外循环 for x := 0; x < 10; x...
  • 基于python goto的正确用法说明

    千次阅读 2021-04-27 01:00:47
    首先是安装,python没有这个,需要安装别的pip install goto-statement看了一篇文章,都是直接官网的列子,根本不能用,所以自己搜集了资料,接下来介绍这三个包是要用的,而不是只有最后一个import gotofrom ...
  • c语言中goto是什么意思

    千次阅读 2021-05-18 15:06:32
    满意答案jaylou19852018.02.09采纳率...不要频繁的使用goto,过多的使用goto语句,会使程序混乱从理论上讲,goto语 句是没有必要的,实践中不使用goto语句也可以很容易地写出代码但是,在某些场合下goto语句还是用得...
  • goto语句只能用于退出多层循环.doc

    千次阅读 2020-12-17 13:10:53
    goto语句只能用于退出多层循环goto语句只能用于退出多层循环篇一:goto语句只能用于退出多层循环for (condition1){ for (condition2) { for (condition3) { if (condition) { symbol = 1; } } if (symbol == 1) ...
  • python turtle goto不工作了

    千次阅读 2021-01-13 23:56:07
    goto太过分了,但没有划出一条线。即使我把乌龟。下来()在我进入While循环之前它没有画线。在import turtledef Change_tekenpunt(x,y):turtle.up()turtle.goto(x,y)turtle.down()def xAxisTurtl...
  • Python:turtle goto()命令

    千次阅读 2020-11-29 19:24:37
    如果您坚持使用纯粹的相对命令,那么就不必费心去想goto坐标公式的正确性:turtle.penup() turtle.left(90) turtle.forward(10) turtle.left(90) turtle.forward(10) turtle.left(180) turtle.pendown() 使用纯相对...
  • 业精于勤荒于嬉,行成于思毁于随。 今天写一个强制关机的程序,以及goto语句跳出多层循环的应用。
  • C# goto语句

    千次阅读 2020-06-03 11:31:42
    一、C# goto语句 goto语句把控制交给由标记标识符命名的语句。 语法格式如下: goto label; ...... label: ...在C#中,任何语句都可以被标记。语句标记后紧跟一个冒号,一个标记标识符。 常用的格式如下: goto...
  • C语言goto语句简单使用

    万次阅读 多人点赞 2020-10-16 23:12:54
    C语言中提供了可以随意滥用的 goto语句和标记跳转的标号。 从理论上 goto语句是没有必要的,实践中没有goto语句也可以很容易的写出代码。 但是某些场合下goto语句还是用得着的,最常见的用法就是终止程序在某些深度...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 322,550
精华内容 129,020
关键字:

goto