为 C 示例中的棘手问题推荐一本书,如果条件异常 [重复]

Posted

技术标签:

【中文标题】为 C 示例中的棘手问题推荐一本书,如果条件异常 [重复]【英文标题】:Suggest a book for tricky questions in C example unusual if condition [duplicate] 【发布时间】:2011-09-17 20:00:13 【问题描述】:

可能重复:What does the ',' operator do in C?

好吧,我今天面试了,他们问我下面代码的输出应该是什么

#include<stdio.h>

int main ()


int a=1,b=1;
char c='0';
if(a,b,c)
   printf("wow \n");

在我的机器上运行它之后,我能够得到答案,但我无法在那里回答。我想知道是否允许这样的 if 语句?哪里提到的?

我的问题是上面提到的 if 条件,我无法理解 if 语句是如何工作的。

**更新** 我在 K&R 中没有发现任何这样的东西,任何人都可以推荐一本好书。我已经编写了一些东西,对 C 来说并不陌生,但在这个问题失败后,我想再次深入了解一些 C 概念(特别是如上) 提到了我可以在哪里阅读。

【问题讨论】:

逗号表达式的结果是最后一个表达式的值。哪个是 '0' 而不是零。 @Hans:说真的……在不同的文本框中(例如为答案保留的文本框)写相同的文本并不是一件难事…… 它与if (c) 相同 - 查看this example 中的编译警告。 我看到程序是 C99 (main 中没有 return);但 C99 并未更改 main 的合法签名。有效的签名是int main(void)int main(int argc, char **argv)——程序无效:任何事情都可能发生:) @ruben - 是的,所以不允许发布简短的答案。 【参考方案1】:

看看comma operator。

如您所见,e1, e2, e3 的评估是 e3,符合 ANSI C 标准的规定

所以,您的 if 条件在 '0' 中进行评估,它是 0 字符,其 VALUE 不同于 0,因此,条件为真,并打印出“哇”

【讨论】:

【参考方案2】:

Comma expression。它的结果是最右边的争论,在你的情况下 - c。 同样值得注意的是,逗号表达式保证了一个序列点,即 参数从左到右计算,这与许多其他运算符不同

【讨论】:

在考虑函数参数时,逗号只是一个分隔符。因此,您无法确定评估顺序。因此,一旦你评估了像 foo(a(), b()); 这样的表达式,你就无法知道哪个函数 (a(), b()) 先被调用了。【参考方案3】: 逗号运算符上的

Wikipedia's entry相当不错,它简洁地解释了它是如何工作的。

表达式a, b, c 的结果是c,在这种情况下等于'0',其计算结果为true

【讨论】:

【参考方案4】:

逗号表达式a,b,c 只取最后一个值c 的值,它的字符值'0' 的数值为48。因此表达式的计算结果为真。

【讨论】:

【参考方案5】:

逗号运算符是一个 C++ 运算符,它具有计算所有表达式的效果,并丢弃除最后一个以外的所有表达式的结果。

在您的情况下,以下两个语句是等效的。

if (a,b,c) 
 printf("wow \n");


if (c) 
 printf("wow \n");

在这两种情况下,IF 语句中的代码都将根据c 的值执行。

【讨论】:

kiamlaluno 上面有些人在回复中提到如果将根据 c 而不是 a 进行评估。 @Registered User 这是正确的。逗号运算符从左到右计算,最后计算的表达式的值是与完整表达式关联的值。 @pmg 这是我现在在回答中读到的内容。 它们在一般情况下并不严格等效:想象if (a = 1, b = 2, c = 3) if (c = 3) (忽略一个好的编译器应该为 sn-ps 发出的警告) @pmg 这就是我写“在你的情况下”的原因。【参考方案6】:

逗号表达式的结果是最后一个表达式的值。哪个是 '0' 而不是零。

【讨论】:

【参考方案7】:

现在它已经过时了,作者对 Solaris 环境和编译器做了很多参考,但你可以看看 Peter Van Der Linden 的“Expert C Programming: Deep C Secrets”。至少 90% 的书还是很有用的。甚至还有一个关于面试问题的附录。我不记得是否涵盖了逗号运算符,但还有很多其他内容。

另外两个(免费)资源: http://c-faq.com/

http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf

【讨论】:

以上是关于为 C 示例中的棘手问题推荐一本书,如果条件异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++中的内存泄漏示例(通过使用异常)[重复]

如果 Task.Delay 优于 Thread.Sleep,为啥本书中的示例使用 Thread.Sleep?

零基础的人学java,看哪些书。。求推荐几本书籍

自学Java用哪本书好?

有啥关于 Spark 的书推荐?

推荐一本书java数组