由同事作为一个谜题,我无法弄清楚这个C程序实际上是如何编译和运行的.什么是这个>>>=运算符和奇怪的1P1文字?我在Clang和GCC进行了测试.没有警告,输出是"???"
#include <stdio.h>
int main()
{
int a[2]={ 10, 1 };
while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] )
printf("?");
return 0;
}
Run Code Online (Sandbox Code Playgroud) C和C++中的字符大小是多少?据我所知,char的大小在C和C++中都是1个字节.
#include <stdio.h>
int main()
{
printf("Size of char : %d\n", sizeof(char));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <iostream>
int main()
{
std::cout << "Size of char : " << sizeof(char) << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
没有惊喜,它们都给出了输出: Size of char : 1
现在我们知道,字符表示为'a','b','c','|',...所以我只是修改了上面的代码对这些:
在C:
#include <stdio.h>
int main()
{
char a = 'a';
printf("Size of char : %d\n", sizeof(a));
printf("Size of char : %d\n", sizeof('a'));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Size of char …Run Code Online (Sandbox Code Playgroud) 我不确定使用C枚举的正确语法是什么.我有以下代码:
enum {RANDOM, IMMEDIATE, SEARCH} strategy;
strategy = IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)
但这不会编译,出现以下错误:
error: conflicting types for ‘strategy’
error: previous declaration of ‘strategy’ was here
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
为什么string::compare返回int而不是像?short或更小的类型char?我的理解是这个方法只返回-1,0或1.
第二部分,如果我要设计一个比较两个类型对象的比较方法,Foo我只想返回-1,0或1,是否会使用short或char通常是一个好主意?
编辑:我已经纠正,string::compare不返回-1,0或1,它实际上返回一个值> 0,<0或0.感谢你让我排队.
似乎答案是粗略的,没有理由返回一个小于int因为返回值为"rvalues"的类型,并且那些"rvalues"不会从小于int(4字节)的类型中受益.此外,许多人指出大多数系统的寄存器可能int无论如何都要大小,因为无论你给它们一个1,2或4个字节的值,这些寄存器都将被填充,返回一个没有真正的优势.价值较小.
编辑2:事实上,当使用较小的数据类型(如对齐,屏蔽等)时,看起来可能会有额外的处理开销.一般的共识是,在处理大量数据时,存在较小的数据类型以节省内存,如数组的情况.
今天学到了一些东西,再次感谢你们!
#include <stdio.h>
#include <string.h>
int main(void)
{
char ch='a';
printf("sizeof(ch) = %d\n", sizeof(ch));
printf("sizeof('a') = %d\n", sizeof('a'));
printf("sizeof('a'+'b'+'C') = %d\n", sizeof('a'+'b'+'C'));
printf("sizeof(\"a\") = %d\n", sizeof("a"));
}
Run Code Online (Sandbox Code Playgroud)
该程序用于sizeof计算大小.为什么尺寸'a'不同于ch(哪里ch='a')?
sizeof(ch) = 1
sizeof('a') = 4
sizeof('a'+'b'+'C') = 4
sizeof("a") = 2
Run Code Online (Sandbox Code Playgroud) 我试过了
printf("%d, %d\n", sizeof(char), sizeof('c'));
得到1,4作为输出.如果一个角色的大小是一个,为什么'c'给我4?我想这是因为它是一个整数.所以,当我这样做时,是否会char ch = 'c';发生隐式转换,在它被分配给char变量时,从4字节值到1字节值?
我在我的探查器中闲逛一段时间试图弄清楚如何加速一个常见的日志解析器,这个解析器在日期解析时遇到瓶颈,我尝试了各种算法来加快速度.
我尝试过的对我来说最快的东西也是迄今为止最具可读性,但可能是非标准的C.
这在GCC,icc和我真正古老而挑剔的SGI编译器中运行良好.因为它是一个非常易读的优化,它不是我想要的吗?
static int parseMonth(const char *input) {
int rv=-1;
int inputInt=0;
int i=0;
for(i=0; i<4 && input[i]; i++) {
inputInt = (inputInt << 8) | input[i];
}
switch(inputInt) {
case 'Jan/': rv=0; break;
case 'Feb/': rv=1; break;
case 'Mar/': rv=2; break;
case 'Apr/': rv=3; break;
case 'May/': rv=4; break;
case 'Jun/': rv=5; break;
case 'Jul/': rv=6; break;
case 'Aug/': rv=7; break;
case 'Sep/': rv=8; break;
case 'Oct/': rv=9; break;
case 'Nov/': rv=10; break;
case …Run Code Online (Sandbox Code Playgroud) (sizeof)char总是在32位GCC编译器中返回1.
但由于32位编译器的基本块大小为4,当基本大小为4字节时,char如何占用单个字节?
考虑以下因素:
struct st
{
int a;
char c;
};
Run Code Online (Sandbox Code Playgroud)
sizeof(st)返回为8,默认块大小为4字节(因为分配了2个块)
我永远无法理解为什么sizeof(char)在分配大小为4的块时返回为1.
有人可以解释一下吗???
我会非常感谢任何回复解释它!
编辑:'bits'的拼写错误已更改为'bytes'.我对第一次编辑的人抱歉.我回滚了编辑,因为我没有注意到你做的改变.感谢所有那些指出必须改变的人,尤其是@Mike Burton,因为他们对这个问题进行了抨击,并且@jalf似乎对我对概念的理解得出了结论!
如果我宣布:
int i = 0 + 'A';
Run Code Online (Sandbox Code Playgroud)
是'A'考虑char还是int?
有些人可能会使用:
int i = 0 + (int)'A';
Run Code Online (Sandbox Code Playgroud)
但这真的有必要吗?