我读过,谁能解释这些未定义的行为(i = i++ + ++i,i = i++ 等),并在浪费了 2 多个小时后尝试理解 “comp.lang.c FAQ”上的序列点时间试图通过 gcc 编译器解释以下结果。
expression(i=1;j=2) i j k
k = i++ + j++; 2 3 3
k = i++ + ++j; 2 3 4
k = ++i + j++; 2 3 4
k = ++i + ++j; 2 3 5
k = i++ + i++; 3 2
k = i++ + ++i; 3 4
k = ++i + i++; 3 4
k = ++i + ++i; 3 6
i = i++ + j++; 4 3
i = i++ + ++j; 5 3
i = ++i + j++; 4 3
i = ++i + ++j; 5 3
i = i++ + i++; 4
i = i++ + ++i; 5
i = ++i + i++; 5
i = ++i + ++i; 6
问题:
我想知道上图中显示的所有表达式(4组)是否有未定义的行为?如果只有其中一些具有未定义的行为,哪些有哪些没有?
对于定义的行为表达式,您能否展示(不解释) 编译器如何评估它们。只是为了确保,如果我正确地得到了这个前置增量和后置增量。
背景:
今天,我参加了一次校园面试,在面试中我被要求解释i++ + ++i
给定值i
. 在 gcc 中编译该表达式后,我意识到我在采访中给出的答案是错误的。我决定以后不再犯这样的错误,因此,尝试编译所有可能的前置和后置增量运算符组合并在 gcc 中编译它们,然后尝试解释结果。我挣扎了2个多小时。我找不到对这些表达式求值的单一行为。所以,我放弃了,转向stackoverflow。经过一点点阅读档案,发现有一些类似sequence point
和未定义的行为。