Are these expressions defined?

    int x = 5, y;
    y = ++(int){++x};
    //or 
    y = (int){x++}++;

和(我找不到任何理由不被定义)

    int x = 5;
    x = ++(int){++x};
    //or 
    x = (int){x++}++;

在创建新对象(复合文字)的位置有明确的序列点.

推荐答案

这些都很好:

y = ++(int){++x};
y = (int){x++}++;

因为没有对象被多次读取或写入,特别是xy和未命名的复合文字.修改复合文字也不是问题,因为(在本例中)它具有自动存储持续时间,因此它的生存期是封闭块的生存期,即使它将由于其地址未被获取而不可访问.

相比之下,它们会触发未定义的行为:

x = ++(int){++x};
x = (int){x++}++;

因为x在没有序列点的情况下被多次修改,因为使用复合文字不会引入序列点.

第6.8p4节说明了以下内容(不是粗体部分):

full expression是一个不属于另一个表达式的表达式 表达式或用于声明者.以下每一项都是完整的 表情:an initializer that is not part of a compound literal; 表达式语句中的表达式;控制 Select 语句(ifswitch);一个 whiledo语句;for的每个(可选)表达式 语句;return语句中的(可选)表达式.有一个 完整表达式的求值和 要计算的下一个完整表达式的计算.

在上面的示例中,由于++x是复合文字的初始值设定项的一部分,因此它不符合完整表达式的要求,因此不存在复合文字引入的序列点.

C++相关问答推荐

是否定义了数组指针类型转换为指针类型?""""

括号中的堆栈实现错误问题

是否所有C编译器在将浮点数转换为整型数时都会隐式删除小数?

正确的TCP/IP数据包 struct

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

非常大的数组的大小

_泛型控制表达式涉及数组碰撞警告的L值转换错误?

N的值设置为0或1(未定义的行为),而我正在try 学习realloc和Malloc的用法

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

预先分配虚拟地址空间的区域

在C++中访问双指针

为什么将函数名括在括号中会禁用隐式声明?

Square不与Raylib一起移动

C指针概念分段故障

为什么数组的最后一个元素丢失了?

在C++中允许使用字符作为宏参数

递归打印二维数组(C编程)

%g浮点表示的最大字符串长度是多少?

如何修复数组数据与列标题未对齐的问题?

在 C/C++ 中原子按位与字节的最佳方法?