小编Fid*_*its的帖子

谁定义了C运算符优先级和关联性?

介绍

在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标准.我再一次惊讶地发现在运算符优先级和关联性方面提到的很少.

问题

  1. 如果我认为函数总是从左到右进行评估是错误的,那么表中涉及函数优先级和关联性的真正含义是什么?
  2. 谁定义了运算符优先级和关联性,如果它不是ANSI?如果是ANSI的定义,为什么很少提到运算符优先级和关联性?运算符优先级和关联性是从ANSI C标准推断还是在数学中定义?

c c++ operator-precedence associativity ansi-c

26
推荐指数
3
解决办法
8249
查看次数

嵌入式操作系统的比较?

我参与了一种或另一种类型的嵌入式操作系统,并且通常不得不使用遗留系统所具有的任何功能.现在我有机会从头开始一个新的嵌入式项目.

系统的主要限制是:

  • 它需要一个基于Web的界面.
  • 输入需要实时处理(因此需要真正的RTOS).
  • 可用内存为32MB RAM和FLASH.

团队之前使用的操作系统是VxWorks,ThreadX,uCos,pSOS和Windows CE.

有没有人有关于操作系统选择的比较或贸易研究?

我们应该考虑其他任何操作系统吗?(我们已经建议使用eCos和RT-Linux).

编辑 - 感谢迄今为止的所有回复.遗憾的是我无法将所有标记为"已接受".

embedded operating-system threadx

11
推荐指数
3
解决办法
1万
查看次数

使用'sizeof(char)'动态分配'char'冗余时?

在动态分配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位字节?我误解mallocsizeof(char)

c unicode malloc ascii char

10
推荐指数
2
解决办法
709
查看次数

数组定义 - 表达式必须具有常量值

我正在堆栈上创建一个数组

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导致编译错误.

c

9
推荐指数
1
解决办法
1万
查看次数

静态变量声明(C)

以下两个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

c declaration static-variables language-lawyer

7
推荐指数
2
解决办法
873
查看次数

ARM 汇编访问 C 全局变量

根据http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0056d/Cihcciij.html ,如果我的ARM汇编代码需要访问名为的C全局变量globvar,我应该使用importload类似的说明:

    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编译器。我也在这个论坛中寻找类似的问题,但没有得到有用的结果,那么有人可以帮我解决这个问题吗?非常感谢。

c assembly arm

5
推荐指数
1
解决办法
4543
查看次数

线程堆栈指针

在Linux 2.6.32-32中,有没有办法在程序中以编程方式查找有关线程的以下信息pthreads?我需要:运行计数,堆栈指针,堆栈开始/结束,堆栈大小,堆栈使用.我想,有点像ThreadX,但在一个程序中.谢谢.

c pthreads threadx

4
推荐指数
1
解决办法
2592
查看次数

什么是与LPC1788微控制器一起使用的优秀RTOS?

我正试图找到一个免费/廉价的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倍.感谢您的建议,我觉得有点不好,我不能选择一个接受的答案.

c microcontroller rtos lpc threadx

4
推荐指数
2
解决办法
5866
查看次数

你能不能假设类型转换指针是安全的?

我从很多人那里听说你不能保证类型转换会无损.只有在您不了解处理器时才会这样,也就是说,您还没有验证用于数据类型的字节数?让我举个例子:

如果执行以下操作:

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)

c pointers casting function sizeof

4
推荐指数
1
解决办法
229
查看次数

究竟是select()函数的第一个参数

我不太明白select函数中第一个参数的目的.维基百科将其描述为所有集合中的最大文件描述符,加1.为什么+1以及为什么select需要此信息?

c unix sockets linux

4
推荐指数
2
解决办法
1559
查看次数