在C/C++的每本教科书中,您都可以找到运算符优先级和关联表,如下所示:

http://en.cppreference.com/w/cpp/language/operator_precedence
StackOverflow上的一个问题是这样的:
以下函数的执行顺序如下:
f1() * f2() + f3();
f1() + f2() * f3();
参考上面的图表,我自信地回答说函数具有从左到右的关联性,因此在前面的语句中,在这两种情况下都会像这样评估:
f1() - > f2() - > f3()
评估函数后,您完成评估,如下所示:
(a1*a2)+ a3
a1 +(a2*a3)
令我惊讶的是,很多人告诉我,我错了.决心证明他们错了,我决定转向ANSI C11标准.我再一次惊讶地发现在运算符优先级和关联性方面提到的很少.
我参与了一种或另一种类型的嵌入式操作系统,并且通常不得不使用遗留系统所具有的任何功能.现在我有机会从头开始一个新的嵌入式项目.
系统的主要限制是:
团队之前使用的操作系统是VxWorks,ThreadX,uCos,pSOS和Windows CE.
有没有人有关于操作系统选择的比较或贸易研究?
我们应该考虑其他任何操作系统吗?(我们已经建议使用eCos和RT-Linux).
编辑 - 感谢迄今为止的所有回复.遗憾的是我无法将所有标记为"已接受".
在动态分配chars时,我总是这样做:
char *pCh = malloc(NUM_CHARS * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
然而,我最近被告知,使用sizeof(char)是冗余和不必要的,因为"根据定义,a的大小char是一个字节",所以我应该/可以像这样编写上面的行:
char *pCh = malloc(NUM_CHARS);
Run Code Online (Sandbox Code Playgroud)
我的理解是char的大小取决于目标计算机上使用的本机字符集.例如,如果本机字符集是ASCII,则a char是一个字节(8位),如果本机字符集是UNICODE,char则必然需要更多字节(> 8位).
为了提供最大的可移植性,是不是必须使用sizeof(char),因为malloc只需分配8位字节?我误解malloc和sizeof(char)?
我正在堆栈上创建一个数组
static const int size = 10;
void foo() {
..
int array[size];
..
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到编译错误:"表达式必须具有常量值",即使size是常量.我可以使用宏
#define SIZE (10)
Run Code Online (Sandbox Code Playgroud)
但我想知道为什么size标记const导致编译错误.
以下两个static变量声明是否相同?
1.
static int var1;
static int var2;
static int var3;
Run Code Online (Sandbox Code Playgroud)
2.
static int var1, var2, var3;
Run Code Online (Sandbox Code Playgroud)
更具体地说,在案例2中,所有变量都是static,或者只是var1?
根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0056d/Cihcciij.html
,如果我的ARM汇编代码需要访问名为的C全局变量globvar,我应该使用import和load类似的说明:
AREA globals,CODE,READONLY
EXPORT asmsubroutine
IMPORT globvar
asmsubroutine
LDR r1, =globvar ; read address of globvar into
; r1 from literal pool
LDR r0, [r1]
ADD r0, r0, #2
STR r0, [r1]
MOV pc, lr
END
Run Code Online (Sandbox Code Playgroud)
,但是当我在代码中使用它时,出现"bad instructionimport globvar'"` 错误。我使用的是armv7-android-gcc编译器。我也在这个论坛中寻找类似的问题,但没有得到有用的结果,那么有人可以帮我解决这个问题吗?非常感谢。
在Linux 2.6.32-32中,有没有办法在程序中以编程方式查找有关线程的以下信息pthreads?我需要:运行计数,堆栈指针,堆栈开始/结束,堆栈大小,堆栈使用.我想,有点像ThreadX,但在一个程序中.谢谢.
我正试图找到一个免费/廉价的RTOS,其他人发现它与恩智浦LPC1788微控制器配合得很好.我原本打算使用FreeRTOS,但它似乎不支持那个特定的处理器; 最接近的支持核心是LPC1768.ThreadX可与LPC1788配合使用,但它的许可证将耗资数千英镑.建议?
编辑1:我忘了提及,我正在使用IAR Embedded Workbench.
编辑2:我想我还应该指出,我对嵌入式编程相当新,更不用说使用RTOS了.FreeRTOS和ThreadX似乎非常相似,都有相当直观的API.另一个RTOS的API与这些API的匹配越多,我想就越好.
编辑3:我一直在寻找一个名为embOS的RTOS.它看起来很专业,API看起来不错,它们支持相当数量的处理器/ IDE组合(包括我的),而且我已经有一个示例项目正常工作.它不是免费的,它的许可证将花费大约2500欧元,但这仍然比threadX许可证便宜约3倍.感谢您的建议,我觉得有点不好,我不能选择一个接受的答案.
我从很多人那里听说你不能保证类型转换会无损.只有在您不了解处理器时才会这样,也就是说,您还没有验证用于数据类型的字节数?让我举个例子:
如果执行以下操作:
typedef struct
{
int i;
char c;
float f;
double d;
} structure;
size_t voidPtrSz = sizeof(void *);
size_t charPtrSz = sizeof(char *);
size_t intPtrSz = sizeof(char *);
size_t floatPtrSz = sizeof(float *);
size_t doublePtrSz = sizeof(double *);
size_t structPtrSz = sizeof(structure *);
size_t funcPtrSz = sizeof(int (*)(float, char));
printf("%lu\n", voidPtrSz);
printf("%lu\n", charPtrSz);
printf("%lu\n", intPtrSz);
printf("%lu\n", floatPtrSz);
printf("%lu\n", doublePtrSz);
printf("%lu\n", structPtrSz);
printf("%lu\n", funcPtrSz);
Run Code Online (Sandbox Code Playgroud)
......输出如下......
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)
您能否假设在所有情况下都可以安全地将特定数据类型指针类型转换为另一个数据类型指针?例如,如果您执行此操作:
int foo(float, char)
{
}
void …Run Code Online (Sandbox Code Playgroud) 我不太明白select函数中第一个参数的目的.维基百科将其描述为所有集合中的最大文件描述符,加1.为什么+1以及为什么select需要此信息?