C-算术和优先级
C-Arithmetics and precedence
我正在练习更快地阅读 C 代码,但我很难理解这部分内容:
int a = 7, b = 3, c = 2, d;
d = (b+c >a) || a > c ? a-- : a++;
当我将它输入我的程序并打印出整数 d 时,我得到了 7 的结果。但我真的不明白为什么。有人可以给我解释一下吗?
您正在为 d
分配 a--
或 a++
的值。这两个表达式的值都是7
(原的值是a
);运算符之间的区别在于它们对操作数 (a
) 在 评估表达式后所做的操作:一个然后递增它,另一个递减它。
这就是为什么它们被称为 post-递增和 post-递减运算符的原因。
也许您对 pre-increment 和 pre-decrement 运算符感到困惑,它们是 ++a
和 --a
? (另请参阅:Pre increment vs Post increment in array。)
至于三元运算符(x ? y : z
)和如何'read'那个,那你可以把它当作if x then y else z;
所以,如果测试的结果(其中有一个逻辑或,这意味着如果 either 比较为真)为真,则为真,则为 d = a--
,否则为 d = a++
。但是,如前所述,在这种情况下,两者都会给 d
相同的值(尽管它们会对 a
产生不同的影响)。另请注意,三元运算符具有 lower precedence 而不是逻辑 OR 或关系比较,因此您可以阅读 =
和 ?
之间的所有内容(另一组) 括号。
表达式解析为
d = ((b+c >a) || a > c) ? a-- : a++;
所以 d
得到 a—
或 a++
的结果,在这两种情况下都是 7
。区别在于计算表达式后 a
的值。
||
强制从左到右求值,所以 b+c > a
首先求值。由于 b+c
是 5
,表达式的结果为假 (0
),因此计算 a > c
。该表达式的结果为真 (1
),因此 (b+c > a) || a > c
的结果为真 (1
),这意味着我们将 a—
的结果分配给 d
.因此 d
将是 7
而 a
将是 6
.
这就是运算符优先级在 C 中的工作方式
第 1 步
d = (3 + 2 > 7) || 7 > 2 ? a-- : a++;
第 2 步
d = false || true ? a-- : a++;
第 3 步
d = true ? a-- : a++;
此处 'a' 的值将更改,但不会在此语句中更改,因此 'a' 的值仍为 7
但是如果你在其他语句中打印 a 它会变成 6.
了解更多关于运算符优先级的信息https://en.cppreference.com/w/c/language/operator_precedence
我正在练习更快地阅读 C 代码,但我很难理解这部分内容:
int a = 7, b = 3, c = 2, d;
d = (b+c >a) || a > c ? a-- : a++;
当我将它输入我的程序并打印出整数 d 时,我得到了 7 的结果。但我真的不明白为什么。有人可以给我解释一下吗?
您正在为 d
分配 a--
或 a++
的值。这两个表达式的值都是7
(原的值是a
);运算符之间的区别在于它们对操作数 (a
) 在 评估表达式后所做的操作:一个然后递增它,另一个递减它。
这就是为什么它们被称为 post-递增和 post-递减运算符的原因。
也许您对 pre-increment 和 pre-decrement 运算符感到困惑,它们是 ++a
和 --a
? (另请参阅:Pre increment vs Post increment in array。)
至于三元运算符(x ? y : z
)和如何'read'那个,那你可以把它当作if x then y else z;
所以,如果测试的结果(其中有一个逻辑或,这意味着如果 either 比较为真)为真,则为真,则为 d = a--
,否则为 d = a++
。但是,如前所述,在这种情况下,两者都会给 d
相同的值(尽管它们会对 a
产生不同的影响)。另请注意,三元运算符具有 lower precedence 而不是逻辑 OR 或关系比较,因此您可以阅读 =
和 ?
之间的所有内容(另一组) 括号。
表达式解析为
d = ((b+c >a) || a > c) ? a-- : a++;
所以 d
得到 a—
或 a++
的结果,在这两种情况下都是 7
。区别在于计算表达式后 a
的值。
||
强制从左到右求值,所以 b+c > a
首先求值。由于 b+c
是 5
,表达式的结果为假 (0
),因此计算 a > c
。该表达式的结果为真 (1
),因此 (b+c > a) || a > c
的结果为真 (1
),这意味着我们将 a—
的结果分配给 d
.因此 d
将是 7
而 a
将是 6
.
这就是运算符优先级在 C 中的工作方式
第 1 步
d = (3 + 2 > 7) || 7 > 2 ? a-- : a++;
第 2 步
d = false || true ? a-- : a++;
第 3 步
d = true ? a-- : a++;
此处 'a' 的值将更改,但不会在此语句中更改,因此 'a' 的值仍为 7 但是如果你在其他语句中打印 a 它会变成 6.
了解更多关于运算符优先级的信息https://en.cppreference.com/w/c/language/operator_precedence