gCc中的整数除法和取模示例 modulo.c(-/calg/modulo)-gedit Open·Save 马←Undo+¥■Q之 modulo.c× 1#include <stdio.h> 2 3int main(int argc,char *argv[]) 4{ 5 printf(“8/3=%d,-B/3=%d小n",8/3,-8/3); 6 printf("8%3=%d,-8%%3=%d小八n",8%3,-8%3): 7 return 0; 8} C·Tab Width:4· Ln 6,Col 43 INS wgshengwgsheng-PC:-/calg/modulo wgshengewgsheng-PC:-/calg/modulos ls modulo.c wgsheng@wgsheng-PC:-/calg/modulos gedit modulo.c [1]2453 wgsheng@wgsheng-PC:~/calg/modulos gcc modulo.c -std=c89-o modulo wgsheng@wgsheng-PC:-/calg/modulos./modulo 8/3=2,-8/3=-2 8%3=2,-8%3=-2 wgshengewgsheng-PC:-/calg/modulos gcc modulo.c -std=c99 -o modulo wgsheng@wgsheng-PC:-/calg/modulos ./modulo 8/3=2,-8/3=-2 8%3=2,-8%3=-2 wgsheng@wgsheng-PC:-/calg/modulos 0Q0 11/67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . gcc 中的整数除法和取模示例 11 / 67
由实现定义的行为 ●由实现定义的行为:Implementation-Defined Behavior ●C标准有意未明确规定语言的某些部分,而是由各编译器实 现自行决定 ·由实现定义反映了C注重效率的特点,使得编译器实现可以 依据具体硬件选择最佳实现方式 不建议书写由实现定义的程序! 12/67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 由实现定义的行为 由实现定义的行为:Implementation-Defined Behavior C 标准有意未明确规定语言的某些部分,而是由各编译器实 现自行决定 由实现定义反映了 C 注重效率的特点,使得编译器实现可以 依据具体硬件选择最佳实现方式 不建议书写由实现定义的程序! 12 / 67
运算符优先级(Operator Precedence) 。对ⅰ+j*k的两种可能解释: ·先将ⅰ和j相加,所得结果再乘以k 。将j与k相乘,所得结果再加i ●解决这种问题的方法可以通过加括号实现:(ⅱ+)*k或者 i+(j*k) ●如果没有括号,C将通过运算符优先级来确定表达式的语义 13/67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 运算符优先级 (Operator Precedence) 对 i + j ∗ k 的两种可能解释: 先将 i 和 j 相加,所得结果再乘以 k 将 j 与 k 相乘,所得结果再加 i 解决这种问题的方法可以通过加括号实现:(i + j) ∗ k 或者 i + (j ∗ k) 如果没有括号,C 将通过运算符优先级来确定表达式的语义 13 / 67
算术运算符的优先级 ●最高优先级:+,一(unary) ●次高优先级:*,/,% ●最低优先级:+,一(binary) 示例 。i+j*k→i+(0*k) ·-i*j→(i)*(j) o+i+j/k→(+i)+G/k) 14/67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 算术运算符的优先级 最高优先级:+, − (unary) 次高优先级:∗, /, % 最低优先级:+, − (binary) 示例 i + j ∗ k ⇐⇒ i + (j ∗ k) -i ∗ -j ⇐⇒ (-i) ∗ (-j) +i + j / k ⇐⇒ (+i) + (j / k) 14 / 67
运算符的结合性(Associativity) 。当一个表达式中包含两个以上同等优先级的运算符时,运算 符的结合性可以帮助确定正确的求值顺序 ·如果运算符所在表达式是从左向右进行分组的,则称操作符 具有左结合性 ●所有的二元算术运算符(*,/,%,+,一)都是左结合的(left associative) oi-j-k→(i-j)-k oi*j/k→(i*j)/k 。如果运算符所在表达式是从右向左进行分组的,则称操作符 具有右结合性 ·一元算术运算符都是右结合的 。-+i→-(+i) 15/67
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 运算符的结合性 (Associativity) 当一个表达式中包含两个以上同等优先级的运算符时,运算 符的结合性可以帮助确定正确的求值顺序 如果运算符所在表达式是从左向右进行分组的,则称操作符 具有左结合性 所有的二元算术运算符 (∗, /, %, +, −) 都是左结合的 (left associative) i − j − k ⇐⇒ (i − j) − k i ∗ j / k ⇐⇒ (i ∗ j) / k 如果运算符所在表达式是从右向左进行分组的,则称操作符 具有右结合性 一元算术运算符都是右结合的 − + i ⇐⇒ -(+i) 15 / 67