math execution order in c [closed]

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>int a=17,b=3,r=1;
r = a - a / b * 4 % 3 + r;
</code>
<code>int a=17,b=3,r=1; r = a - a / b * 4 % 3 + r; </code>
int a=17,b=3,r=1;
r = a - a / b * 4 % 3 + r;

in which order a C program will execute this:

  • A) / * % + – =
  • B) / * % – + =

Can you guys give me a solid explanation of the order in which a C program will execute these?

kl-kl+jkljkl-jk-l-jkl-jk-l-jkl

8

The expression will be parsed as

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code>(a - (((a / b) * 4) % 3)) + r;
</code>
<code>(a - (((a / b) * 4) % 3)) + r; </code>
(a - (((a / b) * 4) % 3)) + r;

Graphically:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<code> +
/
- r
/
a %
/
* 3
/
'/' 4
/
a b
</code>
<code> + / - r / a % / * 3 / '/' 4 / a b </code>
              +
             / 
            -   r
           /  
          a   %
             /  
            *   3
           / 
         '/'  4
         / 
        a   b

/, *, and % all have higher precedence than + and -, and arithmetic operators are left-associative (which is why it doesn’t parse as a / (b * (4 % 3))).

But…

Precedence does not control order of evaluation. Each of the subexpressions a, b, and r may be evaluated in any order, even simultaneously. The subexpression a - a / b * 4 % 3 may be evaluated either before or after r. The compiler is free to order evaluations differently from what you would expect, as long as the result obeys the precedence and associativity rules above.

The result is dictated by precedence and associativity.

Multiplication has higher precedence than addition, so

  • a + b * c is equivalent to a + ( b * c ).
  • d * e + f is equivalent to ( d * e ) + f.

Addition and subtraction have the same precedence, so we consult associativity. They are left-associative, so

  • a + b - c is equivalent to ( a + b ) - c.
  • d - e + f is equivalent to ( d - e ) + f.

The multiplication, division and modulus operators also have the same precedence, and are left-associative.

A combined example:

  • a + b * c + d is equivalent to ( a + ( b * c ) ) + d.

Precedence and associativity help define what the code means (how it’s parsed), but you asked about evaluation order. That can’t be answered because C doesn’t dictate the order in which operands are evaluated in these circumstances. For example,

  • a * b + c / d is equivalent to ( a * b ) + ( c / d )

From that, the following is obviously mandated:

  • Both a and b need to be evaluated before the *.
  • Both c and d need to be evaluated before the /.
  • Both * and / need to be evaluated before the +.

But that still leaves many ways of computing the result.

  • a, b, *, c, d, /, +
  • b, a, *, d, c, /, +
  • c, d, /, a, b, *, +
  • a, b, c, d, *, /, +
  • d, c, b, a, *, /, +
  • d, c, b, a, /, *, +
  • etc.

C doesn’t define which one of these the compiler must use. It’s free to use any order which achieves the desired result. It can even change which operations are performed (a simple example of which is changing a division into a multiplication by the inverse), as long as it obtains the correct result.

Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa Dịch vụ tổ chức sự kiện 5 sao Thông tin về chúng tôi Dịch vụ sinh nhật bé trai Dịch vụ sinh nhật bé gái Sự kiện trọn gói Các tiết mục giải trí Dịch vụ bổ trợ Tiệc cưới sang trọng Dịch vụ khai trương Tư vấn tổ chức sự kiện Hình ảnh sự kiện Cập nhật tin tức Liên hệ ngay Thuê chú hề chuyên nghiệp Tiệc tất niên cho công ty Trang trí tiệc cuối năm Tiệc tất niên độc đáo Sinh nhật bé Hải Đăng Sinh nhật đáng yêu bé Khánh Vân Sinh nhật sang trọng Bích Ngân Tiệc sinh nhật bé Thanh Trang Dịch vụ ông già Noel Xiếc thú vui nhộn Biểu diễn xiếc quay đĩa Dịch vụ tổ chức tiệc uy tín Khám phá dịch vụ của chúng tôi Tiệc sinh nhật cho bé trai Trang trí tiệc cho bé gái Gói sự kiện chuyên nghiệp Chương trình giải trí hấp dẫn Dịch vụ hỗ trợ sự kiện Trang trí tiệc cưới đẹp Khởi đầu thành công với khai trương Chuyên gia tư vấn sự kiện Xem ảnh các sự kiện đẹp Tin mới về sự kiện Kết nối với đội ngũ chuyên gia Chú hề vui nhộn cho tiệc sinh nhật Ý tưởng tiệc cuối năm Tất niên độc đáo Trang trí tiệc hiện đại Tổ chức sinh nhật cho Hải Đăng Sinh nhật độc quyền Khánh Vân Phong cách tiệc Bích Ngân Trang trí tiệc bé Thanh Trang Thuê dịch vụ ông già Noel chuyên nghiệp Xem xiếc khỉ đặc sắc Xiếc quay đĩa thú vị
Trang chủ Giới thiệu Sinh nhật bé trai Sinh nhật bé gái Tổ chức sự kiện Biểu diễn giải trí Dịch vụ khác Trang trí tiệc cưới Tổ chức khai trương Tư vấn dịch vụ Thư viện ảnh Tin tức - sự kiện Liên hệ Chú hề sinh nhật Trang trí YEAR END PARTY công ty Trang trí tất niên cuối năm Trang trí tất niên xu hướng mới nhất Trang trí sinh nhật bé trai Hải Đăng Trang trí sinh nhật bé Khánh Vân Trang trí sinh nhật Bích Ngân Trang trí sinh nhật bé Thanh Trang Thuê ông già Noel phát quà Biểu diễn xiếc khỉ Xiếc quay đĩa
Thiết kế website Thiết kế website Thiết kế website Cách kháng tài khoản quảng cáo Mua bán Fanpage Facebook Dịch vụ SEO Tổ chức sinh nhật