top/contents search

3. 表达式

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
它交换了ab

而无需使用临时变量。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 “无符号保留”和“值保留”规则之间有什么区别?


回到顶部

contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管