Tag: 副作用

为什么“volatileQualifiedExpr + volatileQualifiedExpr”不一定是C中的UB而是C ++中的UB?

当我今天阅读C标准时,它说的是副作用 访问易失性对象,修改对象,修改文件或调用执行任何这些操作的函数都是副作用 和C ++标准说 访问由volatile glvalue(3.10)指定的对象,修改对象,调用库I / O函数或调用执行任何这些操作的函数都是副作用 因此,因为禁止在同一个标​​量对象上发生无序的副作用,C允许以下内容,但C ++使其成为未定义的行为 int a = 0; volatile int *pa = &a; int b = *pa + *pa; 我正确地阅读了规格吗? 如果出现差异,原因是什么?

VLA和操作数大小的副作用

我知道sizeof从不评估其操作数,除非在所述操作数是VLA的特定情况下。 或者,我以为我知道。 void g(int n) { printf(“g(%d)\n”, n); } int main(void) { int i = 12; char arr[i]; // VLA (void)sizeof *(g(1), &arr); // Prints “g(1)” (void)sizeof (g(2), arr); // Prints nothing return 0; } 到底是怎么回事? 以防万一,这是在Coliru上用GCC 5.1编译的。