<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Comments on: 解答 C Puzzles</title>
	<atom:link href="http://wangcong.org/blog/?feed=rss2&#038;p=291" rel="self" type="application/rss+xml" />
	<link>http://wangcong.org/blog/?p=291</link>
	<description>Stay Hungry, Stay Foolish</description>
	<lastBuildDate>Thu, 02 Sep 2010 16:18:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>By: 林健的BLOG &#187; Blog Archive &#187; sizeof的一些牛角尖问题</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-8797</link>
		<dc:creator>林健的BLOG &#187; Blog Archive &#187; sizeof的一些牛角尖问题</dc:creator>
		<pubDate>Sun, 15 Feb 2009 08:08:40 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-8797</guid>
		<description>[...] sizeof的一些牛角尖问题 02月 15, 2009 &#124; 4:08 pm分类：Linux与开源 &#124; 标签：C语言sizeof编译器 &#124; 1次阅读 　　昨天看了一些C语言问题（http://www.gowrikumar.com/c/）以及国内几个Geeks的解答（http://wangcong.org/blog/?p=291，http://www.matrix67.com/blog/archives/429），看来自己的C基础还是可以的，没遇到什么大问题。有时候自己也去分析过IOCCC（http://www.ioccc.org/）的代码，或多或少可以学到一些东西。尽管听起来都像是“‘回’字有四样写法”的那样。 　　说几条我最近想到的问题及其解答，都是关于sizeof的： 　　1、sizeof(i++)之后，i的值会怎样？答案是不变。记得大一初学C语言时想研究一下sizeof与函数有什么区别，得到的结果只是一些语法上的差别；学了汇编之后看看编译器生成的代码，才发现sizeof在编译时直接给定了一个常值，而非在运行时求值。进而又分析过sizeof(表达式)的结果，清楚了类型提升原理。但我之前没有注意过表达式中出现副作用的问题，于是在sizeof(i++)的问题上犹豫了。现在经过查阅资料和实验，结论是：sizeof在大多数情况下是编译时定值的，表达式中的任何副作用（包括有副作用的运算符、函数调用等）都不会发生。这里说“大多数情况”，排除了针对C99的新特性——不定长数组（variable length array）的特例。参考这篇文章（http://rednaxelafx.javaeye.com/blog/225909），如果sizeof运算符的参数是一个不定长数组，则该需要在运行时计算数组长度。 　　2、sizeof(&#8217;a&#039;)的结果是多少？这个要看是在C中还是C++中了。根据标准的规定，在C的算术类型提升时，字符常量&#8217;a&#039;自动提升为整型，故结果是4（对于32位机器）；而在C++中则有字符常量的规定，&#8217;a&#039;就是一个单字节的字符常量，故结果是1。我这样理解：C强调了char的“数”属性，而C++强调了char的“字符”属性。 　　3、sizeof(&#8217;ab&#8217;)的结果又是多少？&#8217;ab&#8217;这种语法我以前没有注意到。经查，这叫做“多字节字符常量”（multi-character character constant），它限制在单引号中包含2至4个字节。根据标准，多字节字符常量的语义由编译器的实现决定。在我测试的gcc 4.0和VS2008中，如果int a = &#8216;abcd&#8217;，则a == 0&#215;61626364。sizeof(&#8217;ab&#8217;) == sizeof(&#8217;abc&#8217;) == sizeof(&#8217;abcd&#8217;) == 4。 　　4、那么sizeof(L&#8217;a&#039;)呢？虽然wchar_t是在源代码级可移植的宽字符，但其大小依赖于操作系统或编译器的定义。独立出现的wchar_t常量并不会像char常量那样做算术提升，所以sizeof(L&#8217;a&#039;)就等于sizeof(wchar_t)。在我在32位Windows和Linux平台下分别为4和2。 　　5、至于sizeof(L&#8217;ab&#8217;)、sizeof(L&#8217;中&#8217;)、sizeof(L&#8217;中国&#8217;)又会如何？宽字符常量的单引号中出现多个字节构成的单个字符（如L&#8217;中&#8217;）是合法的，对它取sizeof，结果等于具体实现下的sizeof(wchar_t)。但出现多个字节构成的多个字符（如L&#8217;ab&#8217;、L&#8217;中国&#8217;）则是没有定义的，编译器可能报错，也可能给出不同的实现。在我测试的gcc4.0和VS2008中，L&#8217;abcd&#8217;分别返回了0&#215;64和0&#215;61。对它们取sizeof，结果等于具体实现下的sizeof(wchar_t)，但注意这是标准未定义的，不应该确信。 　　这些东西在现实的工程中很少用到，毕竟自己写代码的时候都偏向于保守的、确保清晰而正确的方法。但在求职面试之类的场合，sizeof还是一个比较重要的考点，钻一钻牛角尖是值得的。 [...]</description>
		<content:encoded><![CDATA[<p>[...] sizeof的一些牛角尖问题 02月 15, 2009 | 4:08 pm分类：Linux与开源 | 标签：C语言sizeof编译器 | 1次阅读 　　昨天看了一些C语言问题（http://www.gowrikumar.com/c/）以及国内几个Geeks的解答（http://wangcong.org/blog/?p=291，http://www.matrix67.com/blog/archives/429），看来自己的C基础还是可以的，没遇到什么大问题。有时候自己也去分析过IOCCC（http://www.ioccc.org/）的代码，或多或少可以学到一些东西。尽管听起来都像是“‘回’字有四样写法”的那样。 　　说几条我最近想到的问题及其解答，都是关于sizeof的： 　　1、sizeof(i++)之后，i的值会怎样？答案是不变。记得大一初学C语言时想研究一下sizeof与函数有什么区别，得到的结果只是一些语法上的差别；学了汇编之后看看编译器生成的代码，才发现sizeof在编译时直接给定了一个常值，而非在运行时求值。进而又分析过sizeof(表达式)的结果，清楚了类型提升原理。但我之前没有注意过表达式中出现副作用的问题，于是在sizeof(i++)的问题上犹豫了。现在经过查阅资料和实验，结论是：sizeof在大多数情况下是编译时定值的，表达式中的任何副作用（包括有副作用的运算符、函数调用等）都不会发生。这里说“大多数情况”，排除了针对C99的新特性——不定长数组（variable length array）的特例。参考这篇文章（http://rednaxelafx.javaeye.com/blog/225909），如果sizeof运算符的参数是一个不定长数组，则该需要在运行时计算数组长度。 　　2、sizeof(&#8217;a&#8217;)的结果是多少？这个要看是在C中还是C++中了。根据标准的规定，在C的算术类型提升时，字符常量&#8217;a&#8217;自动提升为整型，故结果是4（对于32位机器）；而在C++中则有字符常量的规定，&#8217;a&#8217;就是一个单字节的字符常量，故结果是1。我这样理解：C强调了char的“数”属性，而C++强调了char的“字符”属性。 　　3、sizeof(&#8217;ab&#8217;)的结果又是多少？&#8217;ab&#8217;这种语法我以前没有注意到。经查，这叫做“多字节字符常量”（multi-character character constant），它限制在单引号中包含2至4个字节。根据标准，多字节字符常量的语义由编译器的实现决定。在我测试的gcc 4.0和VS2008中，如果int a = &#8216;abcd&#8217;，则a == 0&#215;61626364。sizeof(&#8217;ab&#8217;) == sizeof(&#8217;abc&#8217;) == sizeof(&#8217;abcd&#8217;) == 4。 　　4、那么sizeof(L&#8217;a&#8217;)呢？虽然wchar_t是在源代码级可移植的宽字符，但其大小依赖于操作系统或编译器的定义。独立出现的wchar_t常量并不会像char常量那样做算术提升，所以sizeof(L&#8217;a&#8217;)就等于sizeof(wchar_t)。在我在32位Windows和Linux平台下分别为4和2。 　　5、至于sizeof(L&#8217;ab&#8217;)、sizeof(L&#8217;中&#8217;)、sizeof(L&#8217;中国&#8217;)又会如何？宽字符常量的单引号中出现多个字节构成的单个字符（如L&#8217;中&#8217;）是合法的，对它取sizeof，结果等于具体实现下的sizeof(wchar_t)。但出现多个字节构成的多个字符（如L&#8217;ab&#8217;、L&#8217;中国&#8217;）则是没有定义的，编译器可能报错，也可能给出不同的实现。在我测试的gcc4.0和VS2008中，L&#8217;abcd&#8217;分别返回了0&#215;64和0&#215;61。对它们取sizeof，结果等于具体实现下的sizeof(wchar_t)，但注意这是标准未定义的，不应该确信。 　　这些东西在现实的工程中很少用到，毕竟自己写代码的时候都偏向于保守的、确保清晰而正确的方法。但在求职面试之类的场合，sizeof还是一个比较重要的考点，钻一钻牛角尖是值得的。 [...]</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: kongove</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-7152</link>
		<dc:creator>kongove</dc:creator>
		<pubDate>Wed, 09 Jul 2008 01:23:05 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-7152</guid>
		<description>to jtkk:
要是把default拼成”defau1t”那才绝呢~

defau1t在这里被识别成了普通的标签~</description>
		<content:encoded><![CDATA[<p>to jtkk:<br />
要是把default拼成”defau1t”那才绝呢~</p>
<p>defau1t在这里被识别成了普通的标签~</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: jtkk</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-7094</link>
		<dc:creator>jtkk</dc:creator>
		<pubDate>Tue, 01 Jul 2008 10:38:56 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-7094</guid>
		<description>6. case后面的是字符，不是整数。
这个不对,是因为源码中的default拼得不对(代码中是&quot;defa1ut&quot;)</description>
		<content:encoded><![CDATA[<p>6. case后面的是字符，不是整数。<br />
这个不对,是因为源码中的default拼得不对(代码中是&#8221;defa1ut&#8221;)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: aaaaaaaaaaaaa</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-6755</link>
		<dc:creator>aaaaaaaaaaaaa</dc:creator>
		<pubDate>Sun, 11 May 2008 13:43:09 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-6755</guid>
		<description>19. format string overflow？！

请问连个int的空间都没有了怎么还能传那么长的字符串？不是“？！”是“！！”：）

34. 把for括号里的最后一个i换成n。暂时就想到这一个解法。

-i&lt;n

i+n</description>
		<content:encoded><![CDATA[<p>19. format string overflow？！</p>
<p>请问连个int的空间都没有了怎么还能传那么长的字符串？不是“？！”是“！！”：）</p>
<p>34. 把for括号里的最后一个i换成n。暂时就想到这一个解法。</p>
<p>-i&lt;n</p>
<p>i+n</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 王 聪</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-3879</link>
		<dc:creator>王 聪</dc:creator>
		<pubDate>Thu, 27 Mar 2008 04:46:59 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-3879</guid>
		<description>你说的第2点我已经指出了。关于default，那是作者故意欺骗，无聊的把戏，你认为实际中vim/emacs不认得么？</description>
		<content:encoded><![CDATA[<p>你说的第2点我已经指出了。关于default，那是作者故意欺骗，无聊的把戏，你认为实际中vim/emacs不认得么？</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: shiqicai</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-3803</link>
		<dc:creator>shiqicai</dc:creator>
		<pubDate>Wed, 26 Mar 2008 12:41:30 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-3803</guid>
		<description>第六题你肯定没听作者的话，去运行一下。
实际上是defa1ut写错了。
而且字符1，2和10也不相等。</description>
		<content:encoded><![CDATA[<p>第六题你肯定没听作者的话，去运行一下。<br />
实际上是defa1ut写错了。<br />
而且字符1，2和10也不相等。</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 王 聪</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-3075</link>
		<dc:creator>王 聪</dc:creator>
		<pubDate>Thu, 07 Feb 2008 07:20:27 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-3075</guid>
		<description>感谢楼上的解释！明白了，谢谢～！</description>
		<content:encoded><![CDATA[<p>感谢楼上的解释！明白了，谢谢～！</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: 木天</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-3074</link>
		<dc:creator>木天</dc:creator>
		<pubDate>Thu, 07 Feb 2008 06:50:44 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-3074</guid>
		<description>看了下第8个题，应该是分组求和的过程。跟矢量计算机加法算法类似。

对32位的unsigned int x 来说：

首先：将x每1位看作一组，分为32组，每组中相应位本身的值就是该组“1”的个数。这32个值加起来就是要求的答案。

for循环中：

第一轮：把x每相邻两组合并为一组，变成16组，即将x每相邻两组加在一起。这样每组的值就是就是原来相应位置的两小组之和，则这16个值加起来仍是答案。

第二轮：分为8组
……
第五轮：成为1组，得出答案。

这个算法真好，谢谢分享~</description>
		<content:encoded><![CDATA[<p>看了下第8个题，应该是分组求和的过程。跟矢量计算机加法算法类似。</p>
<p>对32位的unsigned int x 来说：</p>
<p>首先：将x每1位看作一组，分为32组，每组中相应位本身的值就是该组“1”的个数。这32个值加起来就是要求的答案。</p>
<p>for循环中：</p>
<p>第一轮：把x每相邻两组合并为一组，变成16组，即将x每相邻两组加在一起。这样每组的值就是就是原来相应位置的两小组之和，则这16个值加起来仍是答案。</p>
<p>第二轮：分为8组<br />
……<br />
第五轮：成为1组，得出答案。</p>
<p>这个算法真好，谢谢分享~</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Kermit</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-3062</link>
		<dc:creator>Kermit</dc:creator>
		<pubDate>Wed, 06 Feb 2008 01:43:06 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-3062</guid>
		<description>RE：BTW，能不能别提win？？？
好。（怕你了-_-!）</description>
		<content:encoded><![CDATA[<p>RE：BTW，能不能别提win？？？<br />
好。（怕你了-_-!）</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: lihlii</title>
		<link>http://wangcong.org/blog/?p=291&#038;cpage=1#comment-3059</link>
		<dc:creator>lihlii</dc:creator>
		<pubDate>Tue, 05 Feb 2008 22:02:04 +0000</pubDate>
		<guid isPermaLink="false">http://wangcong.org/blog/?p=291#comment-3059</guid>
		<description>1. 缓冲 IO 是 stdio lib 的标准功能，也有不缓冲的函数调用，可以设置缓冲的大小。
2. 这是 C 的标准库，因此 Windows 上如果遵从 C 的运行库标准，必须提供。</description>
		<content:encoded><![CDATA[<p>1. 缓冲 IO 是 stdio lib 的标准功能，也有不缓冲的函数调用，可以设置缓冲的大小。<br />
2. 这是 C 的标准库，因此 Windows 上如果遵从 C 的运行库标准，必须提供。</p>
]]></content:encoded>
	</item>
</channel>
</rss>
