我在C或C++中查看单引号与双引号的问题.我无法完全理解给出的解释,所以我写了一个程序:
#include <stdio.h>
int main()
{
char ch = 'a';
printf("sizeof(ch) :%d\n", sizeof(ch));
printf("sizeof(\'a\') :%d\n", sizeof('a'));
printf("sizeof(\"a\") :%d\n", sizeof("a"));
printf("sizeof(char) :%d\n", sizeof(char));
printf("sizeof(int) :%d\n", sizeof(int));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用gcc和g ++编译它们,这些是我的输出:
sizeof(ch) : 1
sizeof('a') : 4
sizeof("a") : 2
sizeof(char) : 1
sizeof(int) : 4
Run Code Online (Sandbox Code Playgroud)
sizeof(ch) : 1
sizeof('a') : 1
sizeof("a") : 2
sizeof(char) : 1
sizeof(int) : 4
Run Code Online (Sandbox Code Playgroud)
g ++输出对我有意义,我对此没有任何疑问.在gcc中,需要sizeof('a')与之不同的是sizeof(char)什么?背后有一些实际的原因还是只是历史?
同样在C中如果char并且'a'具有不同的大小,这是否意味着当我们编写时
char ch = …
当我创建一个将由多个开发人员使用的头文件时,根据其中使用的所有定义和声明,使该头文件自给自足是一种良好的编程习惯.
例如:
头文件1:types.h
#ifndef TYPES_H
#define TYPES_H
typedef unsigned int uint16
#endif
Run Code Online (Sandbox Code Playgroud)
头文件2:myheader.h
#ifndef MYHEADER_H
#define MYHEADER_H
uint16 myfunc(void);
#endif
Run Code Online (Sandbox Code Playgroud)
我在myheader.h中使用了uint16而没有包含types.h.因此,如果有人想在他们的源文件中包含myheader.h,他们应首先包含"types.h",然后包含"myheader.h".因此,这实际上是迫使开发人员按特定顺序包含头文件.我一直认为这是一种不好的做法,但我今天在我公司遇到了一些代码,在一个文件中声明了一个函数,你需要包含至少4个其他头文件.所以现在我很困惑,我错过了什么,是否有任何地方可以认为这是预期的行为.
我对中断有一个基本的疑问.想象一下没有任何中断的计算机,所以为了让它进行I/O,CPU必须轮询*键盘以进行按键,鼠标按键定时等.现在,如果它有中断,CPU将继续检查中断线是否定期变高(或低).那么如何通过使用中断来节省CPU周期.根据我的理解而不是现在检查设备,我们正在检查中断线.有人可以解释我错误的基本逻辑.
*这里通过轮询我并不是说CPU处于忙碌状态.引用维基百科"轮询还指的是重复检查设备是否准备就绪的情况,如果不是,则计算机返回到不同的任务"
我很困惑我们如何能够从函数返回字符串.
char* someFunction()
{
return "Hello, World"
}
Run Code Online (Sandbox Code Playgroud)
上面的return语句不应抛出"函数返回局部变量的地址",它与函数有什么不同:
char* newFunction()
{
char temp[] = "Hello, World";
return temp;
}
Run Code Online (Sandbox Code Playgroud)
实际上确实给出了上面提到的警告.
我收到了错误
error: aggregate value used where an integer was expected
Run Code Online (Sandbox Code Playgroud)
在编译此代码时:
#include <stdio.h>
typedef unsigned long U32;
typedef struct hello_s
{
U32 a:8;
U32 b:24;
}hello_t;
int main()
{
hello_t str;
U32 var;
str.a = 0xAA;
str.b = 0xAAA;
var = (U32)str;
printf("var : %lX\n", var);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释错误的含义,以及我做错了什么.
编辑:我知道这是一个愚蠢的事情.我想知道的是为什么编译器会为此而哭泣.为什么它只能将前32位分配给整数.
我刚刚开始学习python,并且正在使用slice(:)运算符和字符串。由于某些原因,如果我指定了无效的索引,然后是切片运算符,则不会给出“超出范围”错误。
>>> s='Hello'
>>> print s[5]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: string index out of range
>>> print s[5:]
//Prints just a newline, no error
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下为什么我在第二种情况下没有出错。