【问题标题】:how to convert char containing operator into actual operator in C如何将包含字符的运算符转换为C中的实际运算符
【发布时间】:2017-12-11 22:34:07
【问题描述】:

我想问是否可以不使用一堆额外的 if 语句将包含运算符的字符转换为使用单行或几行的实际运算符?我想象中的样子是这样的:

对不起,我只是个初学者。

char a;
scanf("%c", x);
if (x == '+' || x == '-' || x == '*' || x == '/')
a = b x c;

【问题讨论】:

  • 不,如果没有某种切换、查找或类似功能,这是不可能的。
  • 旁白:scanf("%c", x); ==> scanf(" %c", &x);(两个变化)。
  • 在发布问题之前搜索答案。你可能已经找到this
  • 感谢您的回答。 @Mogsdad 这几乎就是我最初所做的,只是想知道是否有更短的方法。

标签: c operators


【解决方案1】:

C 是一种编译型而非解释型语言 - 所有源代码都在编译时而非运行时被翻译为机器级指令,因此通常不可能 - 至少不是您应该合理考虑的任何方式 -最可能的方式看起来像病毒或恶意软件代码行为。

您可以做的是实现像this one 这样的表达式评估器,其中评估整个表达式字符串(不仅是运算符,还包括操作数) - 本质上是在您的代码中实现一个解释器。

如果您只需要一个行表达式来对x 选择的bc 执行操作,那么以下将执行此操作:

a = x == '+' ? b + c : x == '-' ? b - c : x == '*' ? x * c : x == '/' ? x / c : 0 ;

虽然我强烈建议拆分多行以提高可读性:

 a = x == '+' ? b + c : 
                x == '-' ? b - c : 
                           x == '*' ? x * c : 
                                      x == '/' ? x / c : 
                                                 0 ;

虽然事实上我强烈建议不要这样做!请注意,虽然上面严格来说是一个 单个表达式,但它可能比 switch/case 效率低或不高,并且可能与 if/else if 相同。

作为初学者,您应该努力编写简单易读的代码——即使该代码更长。当你成为专家时,你就会知道这样的代码通常是愚蠢的。您通过代码重用而不是编写较短的代码来提高编码效率 - 经常编写一次使用。较短的代码通常不太通用,因此可重用性较差。

【讨论】:

    【解决方案2】:

    不,您必须为您希望应用的每个运算符提供单独的语句,无论是使用“if”、“switch/case”还是函数查找表,编译器都不会执行任何魔法将运行时决策转变为编译时选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      相关资源
      最近更新 更多