3.1 为什么这段代码
a[i] = i++;的函数调用是否会工作?
3.2 在我的编译器下,这段代码
int i = 7; printf("%d\n", i++ * i++);打印出 49。无论求值顺序如何,难道不应该打印出 56 吗?
3.3 我在几个编译器上试验过这段代码
int i = 3; i = i++;有的给了i值为 3,有的给了 4。哪个编译器是正确的?
3.3b 这是一个巧妙的表达式
a ^= b ^= a ^= b它交换了a和和b
而无需使用临时变量。3.4 我可以使用显式括号来强制我想要的求值顺序,并控制这些副作用吗?即使我不这样做,优先级难道不能决定它吗?
3.5 但是关于&&和||我看到像“
while((c = getchar()) != EOF && c != '\n')这样的代码'' ...
3.6 我可以安全地假设,如果左侧决定了结果,那么右侧就不会被求值吗?&&和||运算符?
3.7 为什么
printf("%d %d", f1(), f2());先调用了f2?我以为逗号运算符保证了从左到右的求值。
3.8 我该如何理解本节中的复杂表达式,以及如何避免编写未定义的表达式?什么是“序列点”?
3.9 所以,如果我写
a[i] = i++;并且我不关心a[]的哪个单元格被写入,这段代码就是正确的,并且i会增加一,对吗?
3.10a 人们一直在说i = i++的行为是未定义的,但我刚刚在一个符合 ANSI 标准的编译器上尝试了它,并得到了我预期的结果。
的行为。3.10b 人们告诉我,如果我求值了一个未定义表达式,或者访问了一个未初始化的变量,我会得到一个随机的、垃圾值。但我试过了,得到了零。这是怎么回事?
3.11 如果我不想学习那些复杂的规则,我该如何避免这些未定义的求值顺序问题?
3.12a 之间有什么区别?++i和和?
i++3.12b 如果我不使用表达式的值,我应该使用++i或和来递增变量吗?
3.13 我需要检查一个数字是否在另外两个数字之间。为什么
if(a < b < c)的函数调用是否会工作?
3.14 为什么这段代码
int a = 1000, b = 1000; long int c = a * b;的函数调用是否会工作?
3.14b 如何确保整数算术不会溢出?
3.15 为什么这段代码
double degC, degF; degC = 5 / 9 * (degF - 32);总是给我 0?
3.16 我有一个复杂的表达式,我必须根据条件将其赋值给两个变量中的一个。我可以使用这样的代码吗?
((condition) ? a : b) = complicated_expression;
3.17 我有一些代码,其中包含像
a ? b = c : d之类的表达式,有些编译器接受它,但有些则不接受。
这样的表达式。3.18 “语义在 ANSI C 中发生变化”的警告是什么意思?>`
3.19 “无符号保留”和“值保留”规则之间有什么区别?