小编Lun*_*din的帖子

为什么下面代码中的printf语句打印的是值而不是垃圾值?

int main(){
    int array[] = [10,20,30,40,50] ;
    printf("%d\n",-2[array -2]);
    return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释-2 [array-2]是如何工作的,为什么[]在这里使用?这是我的任务中的一个问题,它给输出"-10",但我不明白为什么?

c arrays pointer-arithmetic subscript-operator

2
推荐指数
1
解决办法
69
查看次数

&&运算符的可交换属性问题

我遇到奇怪问题的下面的代码意味着修剪整数数组的未使用部分,然后将其转换为字符串.

例如: _ABC__DE______会变成_ABC__DE.

输入填充默认字符时会出现问题.(示例中为"_").

sLength 是整数数组的长度 chars

有问题的代码:

  int inputLength = sLength - 1;

  while (chars[inputLength] == defaultChar && inputLength >= 0) {
    inputLength--;
  }

  inputLength++;

  Serial.println("input length: " + String(inputLength));
  // (in)sanity check
  Serial.println(inputLength);
  Serial.println(String(inputLength));
  Serial.println(inputLength <= 0);
  Serial.println(0 <= 0);
  Serial.println(inputLength == 0);
  Serial.println(0 == 0);

  if (inputLength <= 0) {
    //reset cursor position
    Serial.println("index set to 0");
    index = 0;
  } else {
    output = "";
    for (int i = 0; i < inputLength; …
Run Code Online (Sandbox Code Playgroud)

c++ embedded arduino logical-operators

2
推荐指数
1
解决办法
79
查看次数

防止将数据段使用(优化副本)到本地堆栈数据结构/阵列

我正在编写一些固件,需要使用C代码而不使用数据部分。假设人们远离全局变量,这是非常简单的。还是我想。

我写了一些功能类似于以下代码的内容:

void func()
{
    int feature_set[][2] = {
        {feature0, 1},
        {feature1, 0},
        {feature2, 0}
    };

    //Use 'feature_set' for some hardware init
}
Run Code Online (Sandbox Code Playgroud)

在我的特定用例中,feature_set是指我需要用于初始化的一些配置数据。因为我是在堆栈上创建此数据集,所以我期望在使用之前先在堆栈上构造它。我意识到这会创建更多的指令,但是在这种情况下我可以选择这样做。

但是,看完反汇编后,我意识到它实际上是在做这样的事情:

mov ecx, <size>
lea edi, <stack addr>
lea esi, <somewhere in .data>
rep movs
Run Code Online (Sandbox Code Playgroud)

很显然,编译器试图通过在结构中创建const版本.data并在需要时将其复制到堆栈中来优化此操作。

问题:有没有办法防止这种情况?有没有办法告诉编译器不要将数据段用于此操作?更改优化级别可能会起作用,但是我确实希望进行优化……只是不专门针对这种构造。

c embedded optimization gcc

2
推荐指数
1
解决办法
46
查看次数

(void**)&x和(void*)x之间有什么区别?

(void**)&x和(void*)x之间有什么区别?我会给你一些代码,请帮帮我.

float *xd;
int size=width*width*size(float);
cudaMalloc((void **)&x,size); 1
cudaMalloc((void *)x,size);   2
cudaMalloc(&x,size);          3
cudaMalloc(*x,size);          4

cudaFree(xd);
Run Code Online (Sandbox Code Playgroud)

我只想知道其中的区别.

cudaMalloc()函数的第一个参数是指针变量的地址,该变量必须在分配后指向分配的对象.指针变量的地址应该转换为(void**),因为函数需要一个通用指针值; 内存分配函数是一个通用函数,不限于任何特定类型的对象.此地址允许cudaMalloc()函数将已分配对象的地址写入指针变量.3 cudaMalloc()函数的第二个参数以字节为单位给出要分配的对象的大小.第二个参数的使用与C malloc()函数的size参数一致.

c pointers cuda gpgpu gpu-programming

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

面向对象的概念是否适用于C语言?

在C#中,我们了解到当多个函数具有相同的标识符但签名不同时会发生函数重载.

虽然函数重载的概念是面向对象语言的,但在以下观察的基础上它是否也适用于C语言?

printf("%d", 3);

printf("%d + %d = %d", 1 , 2 , 3 );
Run Code Online (Sandbox Code Playgroud)

第一个printf只传递两个参数.第二个printf传递了四个参数.

这是否意味着printf超载?

c c# oop overloading

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

在C中丢弃数十和数百列的int

我想仅测试其单位列值的整数值,我不关心数十或数百列.int值是倒数计时器

因此,当单位列为0到4时,我希望屏幕显示某些内容,当单位为5到9时,我希望屏幕显示其他内容.我想基本上隔离单位列值

想不出快速而肮脏的做法,不用除以100并减去100的数量,然后用10的数量做同样的事情.在单位列中是否有更简单的方法来移动和测试0到4或5到9

到目前为止,我正在尝试:

int zero_count_units = a_zero_count - (((a_zero_count / 100) * 100) + ((a_zero_count / 10) * 10));

if( (zero_count_units >= 0) && (zero_count_units < 5) )     // 0-4 units column
{
}
else if( (zero_count_units >= 5) && (zero_count_units <= 9) )   // 5-9 units column
{
}
Run Code Online (Sandbox Code Playgroud)

今天早上我的大脑工作得不是很好!任何建议表示非常感谢

c gcc

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

每个转换是否与输入/输出格式说明符相关联C中的序列点?

关于C中序列点的维基百科条目具有以下序列点:

与输入/输出格式说明符关联的每次转换后.例如,在表达式printf("foo%n%d",&a,42)中,在评估%n之后和打印之前有一个序列点42

但C标准也说:

函数指示符的评估顺序,实际参数和实际参数中的子表达式是未指定的,但在实际调用之前有一个序列点.

对于像这样的代码,这两点似乎是矛盾的

int i=1;
printf("%d, %d and %d\n", i++, i++, i--); 
Run Code Online (Sandbox Code Playgroud)

根据每个格式说明符后的维基百科条目,有一个序列点,所以它将打印如下: 1,2,3

但根据C标准中未指明的beaviour条目,它可以打印任何东西.

c stdio operator-precedence undefined-behavior sequence-points

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

在C编程中,所需的L值是语义错误还是语法错误?

1. int main(void) 
2. { 
3.   int a =5, b = 6, c; 
4.   a + b = c; // lvalue required error
5.   2 = a ;     //lvalue required error
6. } 
Run Code Online (Sandbox Code Playgroud)

第4行和第5行代码被视为语法错误或语义错误?据我说,这些行应该抛出语法错误,但我发现Context Free Grammar可以生成它们.

c syntax-error lvalue language-lawyer

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

运算符“ ++”的不允许操作数[MISRA 2012规则10.1,必填]

我正在尝试为其他人编写的模块修复Misra警告。我观察到++正在对进行操作enum

我提到了关于同一主题的SE问题。如何解决此错误?我是否需要建议模块所有者来更改实现?

#include <stdio.h>

typedef enum
{  
    COMPARE = 0,
    INCONSISTENT = 10,
    WRITE,
    READ,
    FINISHED  
}TestsType;

static TestsType CurrentTest;

void fun1(void)
{

    if(READ != CurrentTest)
    {

            CurrentTest++;
    }
    else
    {
            CurrentTest = FINISHED;
    }
}

int main(void) {
    // your code goes here

    CurrentTest = COMPARE;
    fun1();
    printf("%d", CurrentTest);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我将enum这样的代码故意保留在代码中以了解任何影响。但是,在实际代码中,如下所示。

typedef enum
{  
        COMPARE,
        INCONSISTENT,
        WRITE,
        READ,
        FINISHED  
}TestsType;
Run Code Online (Sandbox Code Playgroud)

c enums misra pc-lint

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

C 中带有条件运算符的表达式的类型是什么?

假设我们有以下表达式:

(x>y) ? printf("type of int") : func_string()

那么我们这里有什么?

x>y -> true -> printf("type of int") -> the type of the expression is int (because printf function is an int type function).

或者

x>y -> false -> calls func_string() function which for the purpose of the question, returns a string.

结论是,对于这个表达式的结果,我们只有 2 个选项:一个int function (prinf)OR 一个字符串function (func_string)

这意味着表达式有 2 种可能的类型。

然而,编译器不能真正等到运行时才能获取表达式的类型,编译器不能真正编译代码,同时不确定表达式的类型是 int 还是 string,所以我们会得到一个如果我们尝试运行这种代码,则编译错误,条件运算符的 2 个结果有 2 种不同的类型。

c types conditional-operator

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