感觉有点意外,两个问题:
1、这是为什么?
2、这合理吗?
1、这是为什么?
2、这合理吗?
|
1
2 字节,一个 a,一个换行。
我去测试一下来回复 |
|
ikwJun 22, 2017
2
就是 2 字节
1. "a" + "换行" = 2 2. 合理 |
|
lululauJun 22, 2017 via iPhone
4
不一定,看当前环境的字符编码是什么吧
|
|
5
这个问题太弱智了。我来提供一个巨坑人的题目
sizeof('A') 和 sizeof("A") 谁大? 我见过编程十年的经验的老手都被套路了。 |
|
6
按理说 echo 单一字符不应该强制加换行在末尾吧。
|
|
ETiVJun 22, 2017 via iPhone
7
C 里 sizeof 一个是 char,一个是 char*
|
|
ldbC5uTBj11yaeh5Jun 22, 2017
8
sizeof 这道题我最喜欢去套路那些"熟悉 C/C++"的程序员,鲜有能够滴水不漏完完整整说出来龙去脉的哥们。
|
|
40huoJun 22, 2017 via Android
9
为什么 windows 下是 6 字节。。
|
|
ldbC5uTBj11yaeh5Jun 22, 2017
11
@ETiV 哥们,你也被套路了。这个题目埋了不少雷。C vs C++, 32bit vs LP64 等等呢。
|
|
40huoJun 22, 2017 via Android
12
啊,win 下还会把引号写进去。。
|
|
laoyurJun 22, 2017
13
echo -n "a"
echo "a" 在终端敲一下试试 |
|
14
请使用 echo -ne 'a' > a.txt
不熟指令, echo 不背这锅 |
|
lfk0000Jun 22, 2017 via Android
15
好像换行还分 3 种写法?
想起茴香豆了... |
|
wevstyJun 22, 2017
16
|
|
ldbC5uTBj11yaeh5Jun 22, 2017
17
sizeof(‘ a ’)是 1 应该没有什么争议。
呵呵,你试过了吗? |
|
TinkJun 22, 2017 via iPhone
18
跟操作系统有关
|
|
19
一般来说,当被套路的程序员意识在 c 里面 sizeof('A') 是 sizeof(int), 而在 c++ 里面是 sizeof(char) 的时候。
我都会追问一句,“为什么这么设计?” 能答上来的话,我就不和对方在 c/c++ 基础知识上纠缠了。蛤蛤 |
|
QAPTEAWHJun 22, 2017
21
然后这个文件占 4K 大小?
|
|
22
@lcdtyph c 如此设计的原因和 fgetc 为什么返回值是 int 相同。
c++ 又改成 char 的原因是因为要做操作符重载,不然 cout << 'A' 输出数字就尴尬了。 |
|
qichunrenJun 22, 2017
23
sizeof(‘ a ’)是 1,我试过了,g++, 64 位。
|
|
ldbC5uTBj11yaeh5Jun 22, 2017
24
@qichunren 大兄弟,回帖要看帖。
|
|
wevstyJun 22, 2017
25
|
|
holyghostJun 22, 2017
26
@jigloo
SO 上有一些关注这个的讨论: https://stackoverflow.com/a/3672617 https://stackoverflow.com/a/433988 我猜大意是 C 中的 char 会被当作 int 来处理,C++中处理得更加严谨了一些。 不知道是否靠谱? |
|
27
占用磁盘空间和文件系统有关 最小 512 字节 实际大小看情况
|
|
after1990sJun 22, 2017
28
sizeof 其实是个运算符,可以被重载的。所以 sizeof('a')不一定返回 1.
|
|
lcdtyphJun 22, 2017
29
@after1990s #28 不是所有运算符都能被重载的,而且 sizeof 不是严格的运算符。
|
|
after1990sJun 22, 2017
30
@after1990s 好像并不可以。。。
|
|
jason19659Jun 22, 2017
31
alias cat echo
|
|
0asisJun 22, 2017
33
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 |
|
jixiangqdJun 22, 2017
34
```bash
echo -n "a" ``` |
|
cxbigJun 22, 2017 via iPhone
35
echo 默认带回车
1. echo -n 'a' 2. printf 'a' |
|
36
@0asis 嗯,这个就是这个问题蕴含的另一个套路了,一般如果答题者试图像这样过关的话,接下来是 LP64, ILP64, LLP64 的套路问题等着。
所以我才说,这个问题要答的“滴水不漏”颇为坑人。 |
|
zhangxaochenJun 22, 2017
37
|
|
0asisJun 22, 2017
38
@zhangxaochen #37 可能是 a\0 两个字节?其实我也一直以为对“”取 sizeof 会得到一个 char 的指针的大小
|
|
hsmoccJun 22, 2017 via iPhone
41
不懂 lp64 之类的、感觉 c 不是强类型的语言所以编译器把'a' 当作 int 处理,而 c++这种强类型的是 char 就是 char
|
|
wwqgtxxJun 22, 2017
42
@0asis
const char *c = "a"; std::cout<<sizeof(c)<<std::endl; std::cout<<sizeof("a")<<std::endl; >8 >2 个人觉得这个地方应该是编译器直接求值了 |
|
canfoderiskiiJun 22, 2017 via Android
43
@0asis sizeof 用于字面字符串相当于用于编译期确定长度的数组
|
|
tghgffdgdJun 22, 2017
44
虽然认为是 2 个字节,但是实际上可以 2 个字节,也可以 7 个字节,也可以 8 个字节,跟环境有关系啊
|
|
canfoderiskiiJun 22, 2017 via Android
45
@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 返回值就是数组长度 |
|
lululauJun 22, 2017
46
mkdir tmp
cd tmp rm -rf * echo > a echo > b command ls -l | wc -l # => 答案是几? |
|
veelogJun 22, 2017 via iPhone
47
char s[]="A";
sizeof("A") == sizeof(s) |
|
veelogJun 22, 2017 via iPhone
48
echo -n "" >a.txt
|
|
bumzJun 22, 2017
49
@canfoderiskii #45 不对的。数组长度是 sizeof(array) / sizeof(array[0])。只是由于 sizeof(char) 是 1,分母就没了。
|
|
bumzJun 22, 2017
50
@jigloo #5 char 'A' 会被自动变成 int,因此前者是 4 字节; string literal "A" 是 {'A', '\0'} 的语法糖,占用两字节,因此后者是 2 字节。
相关知识点:char 型的值会自动变 int 型的值,因此 char literal 直接是一个 int,以免多余的类型转换; string literal 是数组的语法糖; sizeof(数组)/sizeof(数组第一个元素)。 |
|
bumzJun 22, 2017
51
数组长度 = sizeof(数组)/sizeof(数组第一个元素)。
|
|
ldbC5uTBj11yaeh5Jun 22, 2017
52
@bumz 大兄弟,还是那句话,回帖要看帖。
|
|
53
这个帖子贼厉害,一个帖子下面讨论两个不同的话题且互不干涉,堪称精分现场典范。
|
|
huluhuluJun 22, 2017
54
文件大小=磁盘一簇的大小,NTFS 或者 fat32 默认是 4k
你也可以更大 |
|
55
取决于文件簇
|
|
56
前面两个黑白头像,还以为网有问题
|
|
canfoderiskiiJun 22, 2017 via Android
57
@bumz 我表述问题而已。sizeof 数组就是数组字节长度
|
|
mingyunJun 22, 2017
58
想起了那个命令行生成 md5 不同的问题,就是因为换行
|
|
extremeJun 22, 2017
59
@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 ... |
|
phoebussJun 23, 2017 via Android
61
应该用 echo -n
|
|
foveciferJun 23, 2017
62
请用 echo -n
|
|
yuchtingJun 23, 2017
63
楼上 sizeof 跑题的那位,这个运算符和编译器(预处理器)有很大关系,有些编译器说不定给出警告甚至错误,在使用 C 和 C++的时候,尽量少使用 sizeof,多用宏直接写死,不写 C++6 年的大叔的忠告。
|
|
intsilenceJun 23, 2017
64
用 echo -n 或者 printf 就好咯。
|
|
ldbC5uTBj11yaeh5Jun 23, 2017
65
@yuchting 蛤蛤,被套路了以后,这转进真奇葩。。。
|
|
ldbC5uTBj11yaeh5Jun 23, 2017
66
这道题是我数年前的原创,专门收拾这些嘴硬的自认为“熟悉 C/C++”的程序员。
|
|
SoloCompanyJun 23, 2017
67
man 一下就有结果的问题就不要意外了,多一个回车这种问题早就应该发现了,否则在一个 shell 里面连续的 echo 语句就会变成一团东西
更大的坑应该是 echo -n 并不是总是有效,你 man 一下 BSD 的 echo 指令( MacOS )的说明,内置的 echo 命令是不支持 -n 的 这个命令 sh -c ‘ echo -n a ’ 在 MacOS 下执行是输出 -n a 而不是 a 所以最保险的方法还是应该使用 printf |
|
NoAnyLoveJul 2, 2017
68
@jigloo 请教一下,关于#19 楼的问题,#22 楼的说法是“ c 如此设计的原因和 fgetc 为什么返回值是 int 相同”。我查了一下,fgetc 的返回值是 int 的原因是为了区分返回值可能是-1 的情况,所以要将 char 升级到 int。但是为啥 C 语言中,sizeof 的情况下也要将其升级为 int 呢?
|
|
panda1001Jul 2, 2017 via Android
69
不指定操作平台和编译器
|
|
owt5008137Jul 2, 2017 via Android
70
|
|
NoAnyLoveJul 3, 2017
71
@owt5008137 “ ch 爱人也能表示-1 ”?这是啥意思?是不是哪个字打错了?
|
|
owt5008137Jul 3, 2017 via Android
72
@NoAnyLove 打错了,char 也能表示-1。(T_T)
|
|
NoAnyLoveJul 3, 2017
73
@owt5008137 那你怎么区分 EOF 和读取了 255 个字节的长度?
|
|
owt5008137Jul 3, 2017 via Android
74
@NoAnyLove 啊。我和你说的不是同一个层面的意思。我说的能表示是说 char 类型可以赋值-1。如果说是范围问题,那确实是不能表示
|
|
NoAnyLoveJul 3, 2017
75
@owt5008137。。。。。。。我在#68 楼说的就是“为了区分返回值可能是-1 的情况” (破涕为笑)
|