为 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 示例中的棘手问题推荐一本书,如果条件异常 [重复]的主要内容,如果未能解决你的问题,请参考以下文章