1

代码是这样的:

char c;  
scanf("%d", &c);  

输入 3...

我的猜测是,当3输入时,它是 type int
然后类型降级为 char 并分配给c;

c我在说明符中打印了%d3 的值,似乎与预期的一样;
但是在终端上打印c带有说明符的值会%c产生--空白--这是一个问题...(1);
为了测试更多,我还声明了一个ch带有类型的变量char并像这样初始化它:

char ch = 1;  

测试是这样的:

(i&j)? printf("yes") : printf("no");  

结果是“否”
我打印出 的值i&j0
1&3应该是1?这是另一个问题....(2);
我的问题是(1)和(2)

4

4 回答 4

4

您实际上是在调用未定义的行为。

通过使用格式 string %d,您告诉scanf期望 anint*作为参数,并且您将向它传递一个指向单个字符的指针。请记住,scanf与您在格式字符串中输入的内容相比,您传递的内容没有更多的类型信息。

这将导致scanf尝试int在指向char大小保留的地址处将大小值写入内存,可能(并且对于大多数体系结构)写入越界。

调用 UB 后,您进一步计算的所有赌注都将取消。

于 2013-02-24T11:22:08.710 回答
1

Suppose that scanf() were not a varargs-function, but a plain ordinary function taking a pointer-to-int as the 2nd argument:

int noscanf(char *format, int *ptr)
{
  *ptr = 42;
  return 1;
}

int main(void)
{
  char ch;
  int rc;

      // This should *at least* give a warning ...
  rc = noscanf("Haha!" , &ch); 

  return 0;
}

Now, scanf() is a varargs function. The only way for scanf() to determine the type of the (pointer) arguments is by inspecting the format string. And a %d means : the next argument is supposed to be a pointer to int. So scanf can happily write sizeof(int) bytes to *ptr.

于 2013-02-24T12:17:19.390 回答
0

我在那里看不到变量j。所以i&j将是 0。是的,如果i == 1然后。j == 3i & j == 1

于 2013-02-24T11:08:04.457 回答
0

(i&j)? printf("是") : printf("否");
语句给出输出是,对于 i=1 和 j=3。

对于 (1) 问题,ASCII 3 适用于不可打印的 STX char。

于 2013-02-24T11:20:17.510 回答