【发布时间】:2021-05-10 18:44:35
【问题描述】:
考虑以下代码:
int y, x; y = 2; x = 0;
x!=0&&y/x>5
我的讲师关于 C 的教科书为“算术、关系和逻辑运算符的优先级层次结构”提供了一个表格,使用该表格来评估上述表达式中的运算符我得到以下优先级:
(1) 是 /,因此,先做 y/x
(2) 是 >,(3) 是 !=,(4) 是 &&。
如果我使用此优先级层次结构评估上述代码,则要评估的第一个子表达式是: y / x 这是 2 / 0,或未定义...
给出的答案是 0。
后来,教科书还指出,根据 ANSI C 标准,&& 左边的操作数总是首先被计算,只有当它是 0 时,右边的操作数才会被计算。
这是否意味着每当一个 logical and (&&) (或一个 logical or (||) 就此事而言) 出现在一个表达式以及算术和关系运算符,实际上我需要将整个表达式的术语分成两组 - && 的左侧术语和右侧术语,然后才开始应用 "算术、关系和逻辑运算符的优先级层次结构” 到整个“左手操作数”中包含的运算符?
这将导致上述表达式被评估为:
(x!=0) && (y/x>5)
从左操作数 (x!=0) 开始,即 (0!=0),为假,因此为 0,因此不再进行评估。
--
如果是这种情况,如果 && 运算符包含在表达式中规定必须首先做什么,为什么它会出现在优先级层次结构的低位?
【问题讨论】:
-
Precedence 控制运算符和操作数的分组 - 它不控制表达式的计算顺序。
标签: c operator-precedence