【问题标题】:ternary operator and goto in c, executing bothc中的三元运算符和goto,同时执行
【发布时间】:2020-02-03 15:17:31
【问题描述】:

我正在尝试在三元运算符中实现 goto:

这就是我正在做的事情:

(a<5 && done==0) ? ({goto dd;}) : ({goto ee;});

使用这些大括号,我正在尝试将语句转换为表达式。

问题是,两个标签都在执行。为什么?

这是代码 (Ideone link):

#include<stdio.h>
int main()
{
    int a=0,sum=0;
    int done=0;

    (a<5 && done==0) ? ({goto dd;}) : ({goto ee;});

    dd:
        printf("%d - %d -- %d\n",a,sum,done);
        ++a,sum+=a;
    ee:
        printf("done\n");
        done=1;
    return 0;
}

【问题讨论】:

  • 你不能真正在三元表达式中有语句(不管你的编译器有什么扩展),只有表达式。那是因为作为表达式,它必须返回一个值。
  • 如果只有第一个被执行,你怎么知道?如果您到达dd,您还将执行位于ee 之后的内容。
  • 运算符用于计算表达式。如果你真的很努力地虐待他们,把一根手指伸进你的眼睛里,如果它受伤了,不要感到惊讶。
  • @r3mainer 我正要写那个。
  • 这么简单的if(){...}有什么问题吗?

标签: c goto conditional-operator


【解决方案1】:

goto dd; 之后,程序控制跳转到dd 标签,执行那里的语句,然后继续执行ee 标签后面的语句。要使控制不从dd 标签后的语句流向ee 标签后的语句,您必须插入return 语句或其他跳转语句。

({goto dd;}) 是对 GCC 语句表达式扩展的严重滥用。不要使用该代码。

【讨论】:

    【解决方案2】:

    三元运算符返回一个值。它不执行该语句。因此,您的 goto 不会被执行。

    【讨论】:

    • goto 被执行
    • 其中一个 goto 被执行。 According to the GCC manual "允许跳出语句表达式,但如果语句表达式是更大表达式的一部分,则未指定该表达式的哪些其他子表达式已被求值,除非语言定义需要在某些子表达式之前求值或在语句表达式之后。”
    猜你喜欢
    • 2013-07-13
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2021-10-25
    相关资源
    最近更新 更多