为什么提到的代码是C中未定义的行为

为什么提到的代码是C中未定义的行为,第1张

概述声明a [i] = i;未定义,因为存在一个混淆,即使用哪个值(旧的或新的)来评估左侧以获得L值.如果使用-Wall编译,此编译器会为此语句提供警告( *** 作..可能未定义). 在下面的代码中,在声明x-> a = x-> b,x – > b; x正在改变,在左侧,它用于获得L值.对于此语句,如果使用-Wall执行,编译器不会发出任何警告. 有人可以解释为什么这不是未定义的行为? 谢谢! struct 声明a [i] = i;未定义,因为存在一个混淆,即使用哪个值(旧的或新的)来评估左侧以获得L值.如果使用-Wall编译,此编译器会为此语句提供警告( *** 作..可能未定义).

在下面的代码中,在声明x-> a = x-> b,x – > b;
x正在改变,在左侧,它用于获得L值.对于此语句,如果使用-Wall执行,编译器不会发出任何警告.

有人可以解释为什么这不是未定义的行为?
谢谢!

struct Data {int a;int b;} y[4] = { 10,20,30,40};struct Data *x = y;int i;for(i=0; i<2; i++) {    x->a = x->b,++x++->b;    printf("%d %d\t",y[i].a,y[i].b);}
解决方法 逗号运算符的优先级最低,

Expression:
assignment-Expression
Expression , assignment-Expression

所以

x->a = x->b,++x++->b;

实际上是

(x->a = x->b),++(x++->b);

并且逗号运算符是一个序列点,因此对x的两个修改是有序的,并且没有未定义的行为.

总结

以上是内存溢出为你收集整理的为什么提到的代码是C中未定义的行为全部内容,希望文章能够帮你解决为什么提到的代码是C中未定义的行为所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1222347.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存