c - C 运算符和优先级
问题描述
我使用 C 语言,代码如下:
#include <stdio.h>
int main(int argc, char const *argv[])
{
int num1=0;
int res = ++num1 && num1++;
printf("%d\t%d\n",num1,res);
}
在上面的代码中,我得到的输出为2 1
. 我认为输出应该是2 0
.
如有错误请指正,为解决此语句,由于优先级最高,首先执行 num1++(0),然后执行 ++num1(2),最后执行 &&,因为它具有最低优先级。
请评论此语句是如何执行的。
在一些教程中,我发现后缀 ++ 和前缀 ++ 具有相同的优先级,但如果这是真的,那么根据关联规则再次 num1++ 应该首先执行(从右到左),这应该再次导致答案为2 0
.
解决方案
在用作初始化器的表达式中
int res = ++num1 && num1++;
运算符有一个序列点&&
。
来自 C 标准(6.5.13 逻辑与运算符)
3 如果 && 运算符的两个操作数比较不等于 0,则 && 运算符将产生 1;否则,它产生 0。结果具有 int 类型。
和
4 与按位二进制 & 运算符不同,&& 运算符保证从左到右的求值;如果计算第二个操作数,则在第一个和第二个操作数的计算之间存在一个序列点。如果第一个操作数比较等于 0,则不计算第二个操作数。
首先计算运算符的左操作数,结果num1
将等于 1,因为一元(前缀)增量运算符。由于子表达式不等于 0,则计算第二个操作数。它的值是递增之前的值,即 1。由于第二个操作数也不等于 0,因此整个表达式被评估为逻辑真,其值为 1(参见 C 标准的第一个引号)。
该值 1 分配给变量res
,而num1
后缀增量后的变量将等于 2。
因此,在此声明之后,您将拥有res
等于1
和num1
等于2
。
推荐阅读
- python - 为我的 web-scraper 传递循环中的错误
- javascript - 打字稿(类型“未定义”不可分配给类型)为什么我的数组有一个 | 不明确的?
- ios - 使用 Swift 通过蓝牙发送消息
- c# - 如何从 byte[] 到 MemoryStream,解压缩,然后写入 FileStream
- javascript - Sails js v1.1 使用两个前端“控制器”滑翔伞错误(vue.js)
- deployment - 如何在 UWP 应用程序中包含 grxml 文件?
- javascript - 以表格形式显示组件的 props Vue
- matlab - 如何使用 pause() 加快绘图速度?
- node.js - 数据未在循环中通过套接字发送数据
- go - antlr4的golang访问者模式是否处于可用状态?