开发者社区> 问答> 正文

C语言中的序列点和I / O格式说明符

C标准(附件C)指出存在一个序列点

与每个格式化的输入/输出功能转换说明符关联的动作之后。

鉴于此,为什么我收到unsequenced modification and access to i以下警告(()?

int i = 0;
printf("%d, %d\n", i, ++i);

根据该标准,在第一个和第二个之后有一个序列点%d。如果是这样,我应该得到一个0 1?但是,在函数参数的评估中没有排序保证,我可能会得到1 1替代?

那么,我引用的标准文本的真正含义是什么?

C

展开
收起
kun坤 2019-11-29 11:32:11 672 0
1 条回答
写回答
取消 提交回答
  • 鉴于此,为什么我得到以下内容的无序修改和访问i(clang)警告?
    
    int i = 0;
    printf("%d, %d\n", i, ++i);
    
    

    因为在评估函数的参数列表时会发生问题,所以实际上是在调用函数之前。对同一个函数调用的多个参数的求值不会相对于彼此排序,并且您都可以i通过单独的,未排序的参数进行读取和修改。

    您引用的规定与此问题无关。它描述了函数执行时执行的I / O操作之间的顺序点。由于函数参数始终按值传递,并且由于在评估参数与执行函数主体之间存在顺序点,因此我看不到该规定与printf-family函数有任何实际联系。

    scanf但是,对于&朋友,此规定有助于确保

    int i; scanf("%d, %d", &i, &i); 具有明确定义的行为,因为它指定对两个结果写入i的顺序是相对于彼此的。

    2019-11-29 11:32:31
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载