【问题标题】:Someone please explain me the logic behind this opration [closed]有人请解释一下这个操作背后的逻辑[关闭]
【发布时间】:2021-10-17 23:02:33
【问题描述】:
#include<stdio.h>
int main(){
    int a=10,b=3,c=2,d=4,result;
    result = a+a*-b/c%d+c*d;
    printf("%d",result);
}

这个程序如何输出 15.. 我不明白操作背后的逻辑.. 有人可以告诉我如何计算吗?

【问题讨论】:

  • 您期待什么结果,为什么?
  • 如果您无法理解复杂的表达式,请将其拆分为更小更简单的部分,将结果存储在临时变量中。继续,直到小表达式不能更小(即它们只做一个操作)。然后使用 debugger 逐语句逐句执行代码,同时监视变量及其值。然后你可以很容易地看到结果何时变成了不应该的结果。
  • 当您对表达式的计算感到困惑时,请使用大括号 ()
  • @AbhilekhGautam:术语“大括号”指的是{},而不是(),因为它们被称为“括号”。两者的总称是"brackets"
  • 你的导师给了你这个练习,以便你思考学习关于C。如果我们只是告诉你这个表达式的作用,你'什么都学不到。

标签: c operator-precedence arithmetic-expressions


【解决方案1】:

相关代码:

int a=10,b=3,c=2,d=4,result;
result=a+a*-b/c%d+c*d;

现在按照operator precedence 的规则将其作为编译器处理:

// Unary minus
result = 10 + 10 * (-3) / 2 % 4 + 2 * 4;

// Multiplication, division, and remainder, with left-to-right associativity.
result = 10 + (-30) / 2 % 4 + 8;
result = 10 + (-15) % 4 + 8; 
result = 10 + (-3) + 8;

// Addition and subtraction, with left-to-right associativity.
result = 15;

注意,根据C99 specificationa == (a / b) * b + a % b对于负数的余数运算必须成立。

【讨论】:

    【解决方案2】:

    请注意,*/% 运算符的 higher precedence+ 具有相同的优先级和从左到右的关联性。另请注意,一元减号运算符(如-b)的优先级高于乘法。

    因此,添加括号以突出运算符的绑定和评估顺序,并添加几行来跟踪中间结果,我们看到以下内容:

    #include<stdio.h>
    int main(){
        int a=10, b=3, c=2, d=4, result;
        result = a + ( ( ( (a*(-b)) ) / c ) % d ) + (c*d);
        //                   ^-30     ^-15   ^-3     ^ 8
        //         ^ a + -3 = 7                   ^ 7 + 8 = 15
        printf("%d",result);
    }
    

    【讨论】:

      【解决方案3】:
      int a = 10, b = 3, c = 2, d = 4, result;
      result=a+a*-b/c%d+c*d;                            // original line, with no spaces added
      

      result = a + (a * (-b) / c % d) + (c * d);
      result = 10 + (10 * -3 / 2 % 4) + (2 * 4);
      result = 10 + (-30 / 2 % 4) + 8;
      result = 10 + (-15 % 4) + 8;
      result = 10 + (-3) + 8;
      result = 15;
      

      【讨论】:

      • @mediocrevegetable1 在 C99 之前,它是实现定义的。但现在它定义明确了。
      • C11 6.5.5 客观地定义了% 运算符。我相信它是在 C99 之前定义的实现。
      • @mediocrevegetable1 %余数 运算符,而不是 运算符。
      • @mediocrevegetable1 确实!如果你从一个负数的苹果开始,无论你除以什么,你都不会得到正余数。 :-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2012-09-21
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2013-05-21
      • 2021-10-30
      相关资源
      最近更新 更多