是表达式求值序列,在gcc编译器中定义,还是未定义

问题描述 投票:0回答:1

在 GNU 的 dd 命令的源代码中github/dd.c,

有一个CPP(CPreProcessor)指令

#define fdatasync(fd) (errno = ENOSYS, -1)
,我理解正确,但是

无论我在 c 编程论坛上读到什么,它都提到表达式求值和返回的顺序在 c 中是未定义的,这意味着在

int i = 0; printf("%d, %d\n", i++, i++);
,我们不能确定,输出将是
0, 1
1, 0

那么 gnu-dd 程序员怎么能如此确定,

-1
将被返回,而不是
errno
,

谢谢

c gcc gnu
1个回答
0
投票

不,some 序列未定义。逗号运算符(a) 不是其中之一。

附录 C(在本例中为 ISO C17)列出了 C 中的序列点。这些序列点的定义使得序列点之前的所有操作和副作用在其开始之后已经完成(或表现得好像已经)完成。

其中一个序列点是:

在以下运算符的第一个和第二个操作数的评估之间:逻辑与

&&
(6.5.13);逻辑或
||
(6.5.14);逗号
,
(6.5.17)


(a)not 用作运算符时,这与逗号 distinct,例如当用于分隔函数的参数时。

© www.soinside.com 2019 - 2024. All rights reserved.