C 下面的输出应该是什么?为什么它应该依赖于编译器?

C 下面的输出应该是什么?为什么它应该依赖于编译器?,c,C,请帮助我理解输出。我们知道,由于“+”从左到右的关联性,我们不能说f1()在f2()之前求值,因为只有当有两个或两个以上具有相同优先级的运算符时,才会发生关联性。那么,应该用什么概念来确定答案呢 // Associativity is not used in the below program. int x = 0; int f1() { x = 5; return x; } int f2() { x = 10; return x; } int main() { int

请帮助我理解输出。我们知道,由于“+”从左到右的关联性,我们不能说f1()在f2()之前求值,因为只有当有两个或两个以上具有相同优先级的运算符时,才会发生关联性。那么,应该用什么概念来确定答案呢

// Associativity is not used in the below program.
int x = 0; 
int f1() {
  x = 5;
  return x;
} 
int f2() {
  x = 10;
  return x;
}
int main() {
  int p = f1() + f2();
  printf("%d ", x);
  return 0;
}

因为标准中没有任何约束

说这句话的部分来自

运算符和操作数的分组由语法指示。85) 除下文规定外,的副作用和价值计算 子表达式未排序。

来自标准本身(显示标准不施加任何约束的示例)

在函数调用中

函数
f1
f2
f3
f4
可以按任何顺序调用。四面八方 效果必须在指定的功能之前完成 调用pf[f1()]

你的问题的答案将是未知的。你不能肯定地说什么。如果调用了
f1()
,则第一个结果将是某种东西,如果相反,则结果将不同

要支持我所说的,请检查此项

。。。在表达式
f(i++)+g(j++)+h(k++)
中,用
i
的原始值的参数,但
i
在 进入
f
的主体。类似地,
j
k
在 分别输入
g
h
但是,未在中指定 执行的顺序是f()、g()、h(),也不是i、j、k的顺序 是递增的。如果f的主体访问变量j和k,则 可能发现两者都有,都没有,或者只是其中一个 增加。(函数调用f(a,b,c)不是使用逗号 运算符;未指定a、b和c的求值顺序。)


因为标准中没有任何约束

说这句话的部分来自

运算符和操作数的分组由语法指示。85) 除下文规定外,的副作用和价值计算 子表达式未排序。

来自标准本身(显示标准不施加任何约束的示例)

在函数调用中

函数
f1
f2
f3
f4
可以按任何顺序调用。四面八方 效果必须在指定的功能之前完成 调用pf[f1()]

你的问题的答案将是未知的。你不能肯定地说什么。如果调用了
f1()
,则第一个结果将是某种东西,如果相反,则结果将不同

要支持我所说的,请检查此项

。。。在表达式
f(i++)+g(j++)+h(k++)
中,用
i
的原始值的参数,但
i
在 进入
f
的主体。类似地,
j
k
在 分别输入
g
h
但是,未在中指定 执行的顺序是f()、g()、h(),也不是i、j、k的顺序 是递增的。如果f的主体访问变量j和k,则 可能发现两者都有,都没有,或者只是其中一个 增加。(函数调用f(a,b,c)不是使用逗号 运算符;未指定a、b和c的求值顺序。)


这两个函数调用的顺序互不确定:

在函数指示符和实际参数的求值之后但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中在被调用函数体执行之前或之后没有特别排序的每个求值,都是相对于被调用函数的执行不确定排序的

不确定的序列意味着

当A在B之前或之后排序时,评估A和B的排序是不确定的,但未指定是哪一个

因此,将首先调用
f1
f2
,并且函数的执行不会交错。您可以通过检查
x
的值来判断它-如果它是
5
,则首先调用
f2
;如果
10
,则首先调用
f1

报告还说:

在程序执行期间多次求值的表达式中,其子表达式的未排序和不确定排序求值不需要在不同求值中一致执行

也就是说,如果在循环中执行此操作,则在第一次迭代时,可能会首先调用
f1
,在下一次迭代时,可能会首先调用
f2



运算符的关联性和优先级与实际求值顺序几乎没有任何关系。
+
的操作数求值顺序与几乎所有其他运算符一样。

这两个函数调用的顺序是不确定的,互为w.r.t.:

在函数指示符和实际参数的求值之后但在实际调用之前有一个序列点。调用函数(包括其他函数调用)中在被调用函数体执行之前或之后没有特别排序的每个求值,都是相对于被调用函数的执行不确定排序的

不确定的序列意味着

评估A和B的顺序不确定
  (*pf[f1()]) (f2(), f3() + f4())