<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>林健的BLOG &#187; sizeof</title>
	<atom:link href="http://blog.linjian.org/articles/tag/sizeof/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.linjian.org</link>
	<description>有容乃大，无欲则刚</description>
	<lastBuildDate>Sun, 29 Aug 2010 13:56:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=abc</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>sizeof的一些牛角尖问题</title>
		<link>http://blog.linjian.org/articles/sizeof-interesting-problems/</link>
		<comments>http://blog.linjian.org/articles/sizeof-interesting-problems/#comments</comments>
		<pubDate>Sun, 15 Feb 2009 08:08:09 +0000</pubDate>
		<dc:creator>Jian Lin</dc:creator>
				<category><![CDATA[计算机科学与编程]]></category>
		<category><![CDATA[C语言]]></category>
		<category><![CDATA[sizeof]]></category>
		<category><![CDATA[编译器]]></category>

		<guid isPermaLink="false">http://blog.linjian.org/?p=195</guid>
		<description><![CDATA[　　昨天看了一些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('a')的结果是多少？这个要看是在C中还是C++中了。根据C99标准的规定，'a'叫做整型字符常量（integer character constant），为int型，故结果是4（对于32位机器）；而ISO C++规定，'a'叫做字符字面量（character literal），为char型，故结果是1。C强调了'a'的“数”属性，而C++强调了'a'的“字符”属性。 　　3、sizeof('ab')的结果又是多少？'ab'这种语法我以前没有注意到。经查，这叫做“多字节字符常量”（multi-character character constant），它限制在单引号中包含2至4个字节。根据标准，多字节字符常量的语义由编译器的实现决定。在我测试的gcc 4.0和VS2008中，如果int a = 'abcd'，则a == 0x61626364。sizeof('ab') == sizeof('abc') == sizeof('abcd') == 4。 　　4、那么sizeof(L'a')呢？虽然wchar_t是在源代码级可移植的宽字符，但其大小依赖于操作系统或编译器的定义。无论C或C++，wchar_t字面量本身就是wchar_t类型的常量，所以sizeof(L'a')就等于sizeof(wchar_t)。在我在32位Windows和Linux平台下分别为2和4。 　　5、至于sizeof(L'ab')、sizeof(L'中')、sizeof(L'中国')又会如何？宽字符常量的单引号中出现多个字节构成的单个字符（如L'中'）是合法的，对它取sizeof，结果等于具体实现下的sizeof(wchar_t)。但出现多个字节构成的多个字符（如L'ab'、L'中国'）则是没有定义的，编译器可能报错，也可能给出不同的实现。在我测试的gcc4.0和VS2008中，L'abcd'分别返回了0x64和0x61。对它们取sizeof，结果等于具体实现下的sizeof(wchar_t)，但注意这是标准未定义的，不应该确信。 　　这些东西在现实的工程中很少用到，毕竟自己写代码的时候都偏向于保守的、确保清晰而正确的方法。但在求职面试之类的场合，sizeof还是一个比较重要的考点，钻一钻牛角尖是值得的。 原文链接：http://blog.linjian.org/articles/sizeof-interesting-problems/，作者：林健。 本作品采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。 (Digital fingerprint: 993d4981d6d552510db9a08493b2dbec)相关文章一道 C 语言指针访存题目的引申C和C++处理register关键字的一处差异编译器与标准——严格还是智能？分清程序“所在路径”和“执行路径”]]></description>
			<content:encoded><![CDATA[<p>　　昨天看了一些C语言问题（<a href="http://www.gowrikumar.com/c/">http://www.gowrikumar.com/c/</a>）以及国内几个Geeks的解答（<a href="http://wangcong.org/blog/?p=291">http://wangcong.org/blog/?p=291</a>，<a href="http://www.matrix67.com/blog/archives/429">http://www.matrix67.com/blog/archives/429</a>），看来自己的C基础还是可以的，没遇到什么大问题。有时候自己也去分析过IOCCC（<a href="http://www.ioccc.org/">http://www.ioccc.org/</a>）的代码，或多或少可以学到一些东西。尽管听起来都像是“‘回’字有四样写法”的那样。<br />
　　说几条我最近想到的问题及其解答，都是关于sizeof的：<br />
　　1、sizeof(i++)之后，i的值会怎样？答案是不变。记得大一初学C语言时想研究一下sizeof与函数有什么区别，得到的结果只是一些语法上的差别；学了汇编之后看看编译器生成的代码，才发现sizeof在编译时直接给定了一个常值，而非在运行时求值。进而又分析过sizeof(表达式)的结果，清楚了类型提升原理。但我之前没有注意过表达式中出现副作用的问题，于是在sizeof(i++)的问题上犹豫了。现在经过查阅资料和实验，结论是：sizeof在大多数情况下是编译时定值的，表达式中的任何副作用（包括有副作用的运算符、函数调用等）都不会发生。这里说“大多数情况”，排除了针对C99的新特性——不定长数组（variable length array）的特例。参考这篇文章（<a href="http://rednaxelafx.javaeye.com/blog/225909">http://rednaxelafx.javaeye.com/blog/225909</a>），如果sizeof运算符的参数是一个不定长数组，则该需要在运行时计算数组长度。<br />
　　2、sizeof('a')的结果是多少？这个要看是在C中还是C++中了。根据C99标准的规定，'a'叫做整型字符常量（integer character constant），为int型，故结果是4（对于32位机器）；而ISO C++规定，'a'叫做字符字面量（character literal），为char型，故结果是1。C强调了'a'的“数”属性，而C++强调了'a'的“字符”属性。<br />
　　3、sizeof('ab')的结果又是多少？'ab'这种语法我以前没有注意到。经查，这叫做“多字节字符常量”（multi-character character constant），它限制在单引号中包含2至4个字节。根据标准，多字节字符常量的语义由编译器的实现决定。在我测试的gcc 4.0和VS2008中，如果int a = 'abcd'，则a == 0x61626364。sizeof('ab') == sizeof('abc') == sizeof('abcd') == 4。<br />
　　4、那么sizeof(L'a')呢？虽然wchar_t是在源代码级可移植的宽字符，但其大小依赖于操作系统或编译器的定义。无论C或C++，wchar_t字面量本身就是wchar_t类型的常量，所以sizeof(L'a')就等于sizeof(wchar_t)。在我在32位Windows和Linux平台下分别为2和4。<br />
　　5、至于sizeof(L'ab')、sizeof(L'中')、sizeof(L'中国')又会如何？宽字符常量的单引号中出现多个字节构成的单个字符（如L'中'）是合法的，对它取sizeof，结果等于具体实现下的sizeof(wchar_t)。但出现多个字节构成的多个字符（如L'ab'、L'中国'）则是没有定义的，编译器可能报错，也可能给出不同的实现。在我测试的gcc4.0和VS2008中，L'abcd'分别返回了0x64和0x61。对它们取sizeof，结果等于具体实现下的sizeof(wchar_t)，但注意这是标准未定义的，不应该确信。<br />
　　这些东西在现实的工程中很少用到，毕竟自己写代码的时候都偏向于保守的、确保清晰而正确的方法。但在求职面试之类的场合，sizeof还是一个比较重要的考点，钻一钻牛角尖是值得的。</p>
<hr />原文链接：<a href="http://blog.linjian.org/articles/sizeof-interesting-problems/">http://blog.linjian.org/articles/sizeof-interesting-problems/</a>，作者：<a href="http://blog.linjian.org/">林健</a>。
<br />本作品采用<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/">知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议</a>进行许可。
<br />(Digital fingerprint: 
 993d4981d6d552510db9a08493b2dbec)<h3  class="related_post_title">相关文章</h3><ul class="related_post"><li><a href="http://blog.linjian.org/articles/c-pointer-alignment-access/" title="一道 C 语言指针访存题目的引申">一道 C 语言指针访存题目的引申</a></li><li><a href="http://blog.linjian.org/articles/c-cpp-register-difference/" title="C和C++处理register关键字的一处差异">C和C++处理register关键字的一处差异</a></li><li><a href="http://blog.linjian.org/articles/compiler-standard-strict-smart/" title="编译器与标准——严格还是智能？">编译器与标准——严格还是智能？</a></li><li><a href="http://blog.linjian.org/articles/program-path-distinction/" title="分清程序“所在路径”和“执行路径”">分清程序“所在路径”和“执行路径”</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://blog.linjian.org/articles/sizeof-interesting-problems/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
