
1 ikw Jun 22, 2017 2 字节,一个 a,一个换行。 我去测试一下来回复 |
2 ikw Jun 22, 2017 就是 2 字节 1. "a" + "换行" = 2 2. 合理 |
4 lululau Jun 22, 2017 via iPhone 不一定,看当前环境的字符编码是什么吧 |
5 ldbC5uTBj11yaeh5 Jun 22, 2017 这个问题太弱智了。我来提供一个巨坑人的题目 sizeof('A') 和 sizeof("A") 谁大? 我见过编程十年的经验的老手都被套路了。 |
6 nikoo OP 按理说 echo 单一字符不应该强制加换行在末尾吧。 |
7 ETiV Jun 22, 2017 via iPhone C 里 sizeof 一个是 char,一个是 char* |
8 ldbC5uTBj11yaeh5 Jun 22, 2017 sizeof 这道题我最喜欢去套路那些"熟悉 C/C++"的程序员,鲜有能够滴水不漏完完整整说出来龙去脉的哥们。 |
9 40huo Jun 22, 2017 via Android 为什么 windows 下是 6 字节。。 |
11 ldbC5uTBj11yaeh5 Jun 22, 2017 @ETiV 哥们,你也被套路了。这个题目埋了不少雷。C vs C++, 32bit vs LP64 等等呢。 |
12 40huo Jun 22, 2017 via Android 啊,win 下还会把引号写进去。。 |
13 laoyur Jun 22, 2017 echo -n "a" echo "a" 在终端敲一下试试 |
14 xss Jun 22, 2017 请使用 echo -ne 'a' > a.txt 不熟指令, echo 不背这锅 |
15 lfk0000 Jun 22, 2017 via Android 好像换行还分 3 种写法? 想起茴香豆了... |
16 wevsty Jun 22, 2017 |
17 ldbC5uTBj11yaeh5 Jun 22, 2017 sizeof(‘ a ’)是 1 应该没有什么争议。 呵呵,你试过了吗? |
18 Tink PRO 跟操作系统有关 |
19 ldbC5uTBj11yaeh5 Jun 22, 2017 一般来说,当被套路的程序员意识在 c 里面 sizeof('A') 是 sizeof(int), 而在 c++ 里面是 sizeof(char) 的时候。 我都会追问一句,“为什么这么设计?” 能答上来的话,我就不和对方在 c/c++ 基础知识上纠缠了。蛤蛤 |
21 QAPTEAWH Jun 22, 2017 然后这个文件占 4K 大小? |
22 ldbC5uTBj11yaeh5 Jun 22, 2017 @lcdtyph c 如此设计的原因和 fgetc 为什么返回值是 int 相同。 c++ 又改成 char 的原因是因为要做操作符重载,不然 cout << 'A' 输出数字就尴尬了。 |
23 qichunren Jun 22, 2017 sizeof(‘ a ’)是 1,我试过了,g++, 64 位。 |
24 ldbC5uTBj11yaeh5 Jun 22, 2017 @qichunren 大兄弟,回帖要看帖。 |
25 strong>wevsty Jun 22, 2017 |
26 holyghost Jun 22, 2017 @jigloo SO 上有一些关注这个的讨论: https://stackoverflow.com/a/3672617 https://stackoverflow.com/a/433988 我猜大意是 C 中的 char 会被当作 int 来处理,C++中处理得更加严谨了一些。 不知道是否靠谱? |
27 yws112358 Jun 22, 2017 via iPhone 占用磁盘空间和文件系统有关 最小 512 字节 实际大小看情况 |
28 after1990s Jun 22, 2017 sizeof 其实是个运算符,可以被重载的。所以 sizeof('a')不一定返回 1. |
29 lcdtyph Jun 22, 2017 @after1990s #28 不是所有运算符都能被重载的,而且 sizeof 不是严格的运算符。 |
30 after1990s Jun 22, 2017 @after1990s 好像并不可以。。。 |
31 jason19659 Jun 22, 2017 alias cat echo |
33 0asis Jun 22, 2017 x64 gcc 下,int *a = 3; sizeof(a) == 8;sizeof(1)==4, sizeof('a') == 4, sizeof("a") == 2 g++下,sizeof(1) == 4, sizeof('a')==1, sizeof("a") == 2 |
34 jixiangqd Jun 22, 2017 ```bash echo -n "a" ``` |
35 cxbig Jun 22, 2017 via iPhone echo 默认带回车 1. echo -n 'a' 2. printf 'a' |
36 ldbC5uTBj11yaeh5 Jun 22, 2017 @0asis 嗯,这个就是这个问题蕴含的另一个套路了,一般如果答题者试图像这样过关的话,接下来是 LP64, ILP64, LLP64 的套路问题等着。 所以我才说,这个问题要答的“滴水不漏”颇为坑人。 |
37 zhangxaochen Jun 22, 2017 |
38 0asis Jun 22, 2017 @zhangxaochen #37 可能是 a\0 两个字节?其实我也一直以为对“”取 sizeof 会得到一个 char 的指针的大小 |
41 hsmocc Jun 22, 2017 via iPhone 不懂 lp64 之类的、感觉 c 不是强类型的语言所以编译器把'a' 当作 int 处理,而 c++这种强类型的是 char 就是 char |
42 wwqgtxx Jun 22, 2017 @0asis const char *c = "a"; std::cout<<sizeof(c)<<std::endl; std::cout<<sizeof("a")<<std::endl; >8 >2 个人觉得这个地方应该是编译器直接求值了 |
43 canfoderiskii Jun 22, 2017 via Android @0asis sizeof 用于字面字符串相当于用于编译期确定长度的数组 |
44 tghgffdgd Jun 22, 2017 虽然认为是 2 个字节,但是实际上可以 2 个字节,也可以 7 个字节,也可以 8 个字节,跟环境有关系啊 |
45 canfoderiskii Jun 22, 2017 via Android @jigloo 查了 c11 标准,标准里面并没有直接提到 sizeof 用于字面字符串的情形。 对于字面字符串,标准 6.4.5 string literal 一节里面有这么一句: The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. For character string literals, the array elements have type char, and are initialized with the individual bytes of the multibyte character sequence. 所以我认为,字面字符串的类型是数组,sizeof 返回值就是数组长度 |
46 lululau Jun 22, 2017 mkdir tmp cd tmp rm -rf * echo > a echo > b command ls -l | wc -l # => 答案是几? |
47 veelog Jun 22, 2017 via iPhone char s[]="A"; sizeof("A") == sizeof(s) |
48 veelog Jun 22, 2017 via iPhone echo -n "" >a.txt |
49 bumz Jun 22, 2017 @canfoderiskii #45 不对的。数组长度是 sizeof(array) / sizeof(array[0])。只是由于 sizeof(char) 是 1,分母就没了。 |
50 bumz Jun 22, 2017 @jigloo #5 char 'A' 会被自动变成 int,因此前者是 4 字节; string literal "A" 是 {'A', '\0'} 的语法糖,占用两字节,因此后者是 2 字节。 相关知识点:char 型的值会自动变 int 型的值,因此 char literal 直接是一个 int,以免多余的类型转换; string literal 是数组的语法糖; sizeof(数组)/sizeof(数组第一个元素)。 |
51 bumz Jun 22, 2017 数组长度 = sizeof(数组)/sizeof(数组第一个元素)。 |
52 ldbC5uTBj11yaeh5 Jun 22, 2017 @bumz 大兄弟,还是那句话,回帖要看帖。 |
53 menc Jun 22, 2017 这个帖子贼厉害,一个帖子下面讨论两个不同的话题且互不干涉,堪称精分现场典范。 |
54 huluhulu Jun 22, 2017 文件大小=磁盘一簇的大小,NTFS 或者 fat32 默认是 4k 你也可以更大 |
55 mozutaba Jun 22, 2017 取决于文件簇 |
56 kingddc314 Jun 22, 2017 前面两个黑白头像,还以为网有问题 |
57 canfoderiskii Jun 22, 2017 via Android @bumz 我表述问题而已。sizeof 数组就是数组字节长度 |
58 mingyun Jun 22, 2017 想起了那个命令行生成 md5 不同的问题,就是因为换行 |
59 extreme Jun 22, 2017 @wwqgtxx You are right // sizeof.cpp #include <iostream> void printSizeof() { int sizeofValue = sizeof("a"); // std::cout<<sizeofValue<<std::endl; } bash - :~ # g++ -c -O0 sizeof.cpp bash - :~ # objdump -S sizeof.o | less ... 0000000000000000 <_Z11printSizeofv>: 0: 55 push %rbp 1: 48 89 e5 mov %rsp,%rbp 4: 48 83 ec 10 sub $0x10,%rsp # 给 int a 分配储存空间,0x10 大概是为了对齐 8: c7 45 fc 02 00 00 00 movl $0x2,-0x4(%rbp) # 把值 0x2 存入变量 a 中 f: 90 nop 10: 48 83 c4 10 add $0x10,%rsp 14: 5d pop %rbp 15: c3 retq ... |
61 phoebuss Jun 23, 2017 via Android 应该用 echo -n |
62 fovecifer Jun 23, 2017 请用 echo -n |
63 yuchting Jun 23, 2017 楼上 sizeof 跑题的那位,这个运算符和编译器(预处理器)有很大关系,有些编译器说不定给出警告甚至错误,在使用 C 和 C++的时候,尽量少使用 sizeof,多用宏直接写死,不写 C++6 年的大叔的忠告。 |
64 intsilence Jun 23, 2017 用 echo -n 或者 printf 就好咯。 |
65 ldbC5uTBj11yaeh5 Jun 23, 2017 @yuchting 蛤蛤,被套路了以后,这转进真奇葩。。。 |
66 ldbC5uTBj11yaeh5 Jun 23, 2017 这道题是我数年前的原创,专门收拾这些嘴硬的自认为“熟悉 C/C++”的程序员。 |
67 SoloCompany Jun 23, 2017 man 一下就有结果的问题就不要意外了,多一个回车这种问题早就应该发现了,否则在一个 shell 里面连续的 echo 语句就会变成一团东西 更大的坑应该是 echo -n 并不是总是有效,你 man 一下 BSD 的 echo 指令( MacOS )的说明,内置的 echo 命令是不支持 -n 的 这个命令 sh -c ‘ echo -n a ’ 在 MacOS 下执行是输出 -n a 而不是 a 所以最保险的方法还是应该使用 printf |
68 NoAnyLove Jul 2, 2017 @jigloo 请教一下,关于#19 楼的问题,#22 楼的说法是“ c 如此设计的原因和 fgetc 为什么返回值是 int 相同”。我查了一下,fgetc 的返回值是 int 的原因是为了区分返回值可能是-1 的情况,所以要将 char 升级到 int。但是为啥 C 语言中,sizeof 的情况下也要将其升级为 int 呢? |
69 panda1001 Jul 2, 2017 via Android 不指定操作平台和编译器 |
70 owt5008137 Jul 2, 2017 via Android |
71 NoAnyLove Jul 3, 2017 @owt5008137 “ ch 爱人也能表示-1 ”?这是啥意思?是不是哪个字打错了? |
72 owt5008137 Jul 3, 2017 via Android @NoAnyLove 打错了,char 也能表示-1。(T_T) |
73 NoAnyLove Jul 3, 2017 @owt5008137 那你怎么区分 EOF 和读取了 255 个字节的长度? |
74 owt5008137 Jul 3, 2017 via Android @NoAnyLove 啊。我和你说的不是同一个层面的意思。我说的能表示是说 char 类型可以赋值-1。如果说是范围问题,那确实是不能表示 |
75 NoAnyLove Jul 3, 2017 @owt5008137。。。。。。。我在#68 楼说的就是“为了区分返回值可能是-1 的情况” (破涕为笑) |