小编Kev*_*ong的帖子

C标准是否明确地将真值指示为0或1?

我们知道任何不相等的数字0都被视为trueC,所以我们可以写:

int a = 16;

while (a--)
    printf("%d\n", a);  // prints numbers from 15 to 0
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否将真/假定义为C中的1/ 0,所以我尝试了下面的代码:

printf("True = %d, False = %d\n", (0 == 0), (0 != 0));  // prints: True = 1, False = 0
Run Code Online (Sandbox Code Playgroud)

请问C标准明确指示的真正的真值和假的10分别?

c

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

为什么终端在Ubuntu中按下箭头键时显示"^ [[A""^ [[B""^ [[C""^ [[D"]?

我首先在Windows上用Ansi C编写了一个小程序,然后我在Ubuntu上用内置的GCC编译它.

该计划很简单:

  • 从控制台读取行scanf().
  • 分析字符串并计算.

但奇怪的事情发生了.当我尝试移动光标时,它会打印四个字符:

  • 按下Up打印"^ [[A"
  • 按下Dn打印"^ [[B"
  • 按下Rt打印"^ [[C"
  • 按下Lt打印"^ [[D"

  • 如何避免这种情况?

  • 为什么打印这4个字符而不是移动光标?

c ubuntu

42
推荐指数
4
解决办法
4万
查看次数

数组和数组有什么区别?

假使,假设

int array[16];
Run Code Online (Sandbox Code Playgroud)

有标准转换称为数组到指针转换,因此array会隐式转换为类型int*,但为什么&array等于array

例如,

int array[16];
void *p = array;
void *q = &array;
printf("%p\n", p);
printf("%p\n", q);
Run Code Online (Sandbox Code Playgroud)

这将给出相同的地址和没有编译错误.

为什么?

c arrays pointers

14
推荐指数
2
解决办法
7069
查看次数

单击透明xlib窗口

我有一个透明的,水印般的应用程序,用C语言写的XLib.目前,如果你点击应用程序的任何地方没有任何反应,但我希望它将鼠标输入传递给它下面的任何东西.例如,如果单击X关闭应用程序下方的窗口,它应该关闭应用程序,而不是什么都不做.

c xlib

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

C中的类型定义中的逗号分隔符是否保证顺序?

逗号运算符具有最低优先级和从左到右的关联性,因此这保证了以下顺序:

i = ++j, j = i++;
Run Code Online (Sandbox Code Playgroud)

i将是2,然后j在此声明之后将是1,如果i并且j首先都是0.

但是,C中的类型定义中的逗号分隔符是否也保证了顺序?如

int i = 1, j = ++i;
Run Code Online (Sandbox Code Playgroud)

c c99 c11

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

预期的声明说明符或"......"之前'('令牌?

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

/// Global Variables
HANDLE ConsoleHandle;

int RGB (int R, int G, int B); // line 8
int Set_Color (int RGB_Fore, int RGB_Back);

int main (void)
{
  // Get Handle
  ConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); 
  char Str [32] = "Happy New Year.\n";
  printf("%s", Str);
  system("pause>nul");
  return 0;
}

int RGB (int R, int G, int B) // line 21
{
  return (R*4 + G*2 + B);
}

int Set_Color (int RGB_Fore, int RGB_Back)
{
  SetConsoleTextAttribute(ConsoleHandle, RGB_Fore*8 + …
Run Code Online (Sandbox Code Playgroud)

c gcc

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

getch()真正得到了什么?扫描码?

#include <conio.h>

int main (void)
{
    for (;;)
    {
        unsigned char ch = getch();
        printf ("0x%02X\n", ch);
    }
}
Run Code Online (Sandbox Code Playgroud)

我想获得扫描码.

以下是维基百科的描述:

    Reads a character directly from the console without buffer, and without echo.
Run Code Online (Sandbox Code Playgroud)

当我按下时Del,它显示0xE0 0x53.

当我按下Ctrl+时PgUp,它显示0xE0 0x86.

虽然有些与表格相同,但它显示的大部分值都与之不同.

那么,getch()真的能获得扫描码吗?

这是扫描码表(第2组,最常用)

扫描码

c console-application getch mingw32 conio

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

整数文字中前导零的含义

我正在学习(ANSI)C 语言编程语言(第2版).

这是2.10赋值运算符和表达式的代码片段:

1  /* bitcount() counts the number of 1-bits in its integer argument */
2  int bitcount(unsigned x)
3  {
4      int b;
5      for (b = 0; x != 0; x >>= 1)
6          if (x & 01)
7              b++;
8      return b;
9  }
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么x & 01写在第6行而不是x & 1x & 0x1?是0之前1有必要吗?

c

6
推荐指数
2
解决办法
1341
查看次数

Typecast到unsigned char并乘以变量

printf("%d\n", (unsigned char)255 * (unsigned char)255);
Run Code Online (Sandbox Code Playgroud)

上面代码的输出是65025但不是1(255*255(mod 256)).为什么?

c

6
推荐指数
2
解决办法
258
查看次数

C中"限制"的关键字相反?

由于严格的别名可能有助于编译器更好地优化,因此C99引入了restrict关键字,如果程序员保证不会通过指向不同类型的指针访问它,则可以将其用作变量的限定符.但是,由于多种原因,不同类型之间的类型转换是不可避免的,这将使编译器假定一个指针不是另一个指针的别名.因此,变通方法是通过传递-fno-strict-aliasing(GCC标志)来禁用全局严格别名优化.这完全没有意义,因为可能只有两个指针不应该完全优化.因此,为什么不引入一个相反的关键字restrict,告诉编译器不要假设这两个指针指向不同的地址.这有点类似于什么volatile,并告诉编译器这个变量被大大改变,所以以特殊的方式对待它们.是否可以创建这样的关键字?

编辑:有一种方法可以解决这个问题.请参阅下面的yano评论.

c restrict strict-aliasing

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

标签 统计

c ×10

arrays ×1

c11 ×1

c99 ×1

conio ×1

console-application ×1

gcc ×1

getch ×1

mingw32 ×1

pointers ×1

restrict ×1

strict-aliasing ×1

ubuntu ×1

xlib ×1