C标准(附件C)指出存在一个序列点
与每个格式化的输入/输出功能转换说明符关联的动作之后。
鉴于此,为什么我收到unsequenced modification and access to i以下警告(()?
int i = 0;
printf("%d, %d\n", i, ++i);
根据该标准,在第一个和第二个之后有一个序列点%d。如果是这样,我应该得到一个0 1?但是,在函数参数的评估中没有排序保证,我可能会得到1 1替代?
那么,我引用的标准文本的真正含义是什么?
C
鉴于此,为什么我得到以下内容的无序修改和访问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的顺序是相对于彼此的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。