【问题标题】:Ruby modulus. Why are these two sums printing different answers?红宝石模数。为什么这两个总和打印出不同的答案?
【发布时间】:2016-11-12 21:57:47
【问题描述】:

我正在学习 ruby​​,但遇到了 %Modulus 和的问题。

puts "example #{101 % 4}"

上面在终端中打印 1,这是我所期望的。

为什么下面会在终端打印 101?确定和上面一样吗?

puts "example #{100 + 1 % 4}"

我知道 % 只是另一种说法“X 除以 Y 剩余 J”。因此,第二个示例肯定也应该返回 1?

任何帮助将不胜感激。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    括号很重要。由于运算符优先规则,第二个示例被 ruby​​ 视为

    100 + (1 % 4)
    

    这给了

    100 + 1
    

    等于 101

    你可能是说

    (100 + 1) % 4
    

    【讨论】:

      【解决方案2】:

      因为% 的优先级高于+。所以你可以做类似的事情

      puts "example #{(100 + 1) % 4}"
      

      【讨论】:

        【解决方案3】:

        正如所指出的,这与运算符优先级有关,例如,您可以使用括号 () 进行控制。 Ruby 的 rules 在官方 Ruby 文档中概述如下:

        从最高到最低,这是 ruby​​ 的优先级表。高的 优先级操作发生在低优先级操作之前。

        !, ~, unary +
        
        **
        
        unary -
        
        *, /, %
        
        +, -
        
        <<, >>
        
        &
        
        |, ^
        
        >, >=, <, <=
        
        <=>, ==, ===, !=, =~, !~
        
        &&
        
        ||
        
        .., ...
        
        ?, :
        
        modifier-rescue
        
        =, +=, -=, etc.
        
        defined?
        
        not
        
        or, and
        
        modifier-if, modifier-unless, modifier-while, modifier-until
        
        { } blocks
        

        有关顺序或优先级(超出编程范围)的更一般概述,请参阅维基百科条目here

        如果出现平局怎么办?

        值得注意的是,如果存在平局(即您的计算中有两个具有相同优先级的运算符),则运算是从左到右进行的。

        考虑:

        10 % 3 * 4
        #=> 4 
        10 * 3 % 4
        #=> 2 
        

        10 * 10 / 2 * 4
        #=> 200 
        10 / 10 * 2 * 4
        #=> 8
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-19
          • 1970-01-01
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多