例如,如果我有,
int a = 42;
unsigned b = 10;
int c = a + b;
对于此语句,int c = a + b;将首先将a转换为unsigned int,还是将b转换为signed int?unsigned int和signed都有相同的转换等级,那么我们如何知道哪一个会被转换呢?是否有标准规则?
我试图了解C函数是如何传递值和返回的。我可以看到下面的代码:
#include <stdio.h>
int fun(int ii, int jj)
{
int kk, ll;
kk = ii + jj;
ll = ii * jj;
return (kk,ll);
}
int main()
{
int i=4, j=5, k, l;
k = fun(i, j);
l = fun(i, j);
printf("%d %d\n", k, l);
return 0;
}
显然,当我试图通过fun()返回2个值时,我没有收到任何错误。
另外,fun()返
这些代码段导致分段错误:
int *i;
printf("%d\n", *i);
int *i = NULL;
printf("%d\n", *i);
虽然这些情况并不是:
int *i;
i = malloc(sizeof *i);
int *i = NULL;
i = malloc(sizeof *i);
在所有示例中,野生指针和空指针被取消引用,并作为参数传递给应该导致分段错误的函数。为什么使用malloc的示例不像预期的那样运行并产生分段错误?
我有一个2D数组A和一个指针ptr指向它里面的某个地方。我知道如何计算行号,但表达式的实际类型似乎是不可移植的:
#include <stdio.h>
int main(void) {
int A[100][100];
int *ptr = &A[42][24];
printf("row number is %d\n", (ptr - A[0]) / (sizeof(A[0]) / sizeof(A[0][0])));
printf("col number is %d\n", (ptr - A[0]) %
我理解++i和i++之间的区别。我觉得这个案子不一样,
我写了这段代码,
u_int8_t a = 255;
main (){
printf("Num is %d\n", ++a ) ;
}
哪种输出
Num is 0
但这个密码,
u_int8_t a = 255;
main (){
printf("Num is %d\n", a+1 ) ;
}
输出,
Num is 256
产生不同产出的原因是什么?
我偶然发现了一段代码:
int x=3;
float y=3.0;
if(x==y)
printf("x and y are equal");
else
printf("x and y are not equal");
为什么这个代码打印"x和y是相等的“?在这里,如果是y=3.1(例如),那么代码会打印"x和y不相等“。有人请解释一下这是怎么回事。
代码如下:目标是判断数组中所有成员的和是正还是负。我知道无符号int是一个错误,因为我想看看它会打印什么。所以问题是为什么它打印负数,我的意思是,将负整数赋值给无符号整数的结果是什么。
#include <stdio.h>
#define ARR_SIZE 5
int main() {
int array[ARR_SIZE] = {1,-2,3,4,-5};
unsigned sum;
int i;
for ( i = 0, sum=0; i < ARR_SIZE; i++ )
sum += array[i];
if( sum > -1 ) printf
我试图在C中测试已签名和未签名的短、int和long版本的相等性。特别是,我使用了以下测试代码:
#include <stdio.h>
int main() {
signed short ss = 0x8000; // 2^15
unsigned short us = 0x8000;
printf("ss = %i, us = %i\n", ss, us);
if (ss == us) { printf("ss == us\n"); }
else { printf("ss != us\n");
检查以下代码片段:
片段#1
int a=20;
int b=30;
byte c= (a>b)? 20:30;
Error:
incompatible types: possible lossy conversion from int to byte
byte c= (a>b)? 20:30;
片段#2
int a=20;
int b=30;
byte h1=70;
byte c= (a>b)? 20:h1;
片段#3
int a=20;
int b=30;
byte h1=70;
byte h2=89;
byte c= (a>b)? h1:h2;
片段#4
byte
我知道类型化指针可以隐式转换为 当传递给一个函数时,该函数需要一个 参数,但我没想到会在三元运算中看到它(至少我认为是这样)。 考虑一下这个简化的代码: int * dude() {
float * f = NULL;
int * i = NULL;
return (0 ? f : i); // pointer type mismatch in conditional expression (good: this is what I want)
} 但如果我把 至 int * dude() {
float * f = NULL;
int * i =
在下面的表达式中,发生了什么转换?
long long a;
long long b;
double c;
b=a*c;
假设long long类型为8字节。
如果a和b都为int,则在表达式b = a * c中,a将被转换为double,并与c进行乘法运算,结果将被转换为int并赋值给b。
我的假设正确吗?
int main(){
long a = 1684 * 2097152;
return 0;
}
上面的代码在编译过程中给出了以下警告:warning: integer overflow in expression of type 'int' results in '-763363328'
我知道我可以通过像1684u一样将其中一个设置为未签名来解决这个问题。
我假设由于C中的提升规则,1684和2097152都被提升为int,然后编译器报告乘法结果对于带符号的整数来说太大了。然而,我的结果类型是一个64 bit long,即使它是有符号的,它也可以很容易
考虑以下程序:
// http://ideone.com/4I0dT
#include <limits>
#include <iostream>
int main()
{
int max = std::numeric_limits<int>::max();
unsigned int one = 1;
unsigned int result = max + one;
std::cout << result;
}
和
// http://ideone.com/UBuFZ
#include <limits>
我已经标记了警告的位置。如果我理解正确地乘以两个32位数可以得到64位,所以我得到了一个错误。
如果C++ int是32位,那么存储64位也是溢出吗?请解释我做错了什么。警告消息显示在VisualStudio2019中。
转换为更大的数据类型解决了这个问题。为什么?
#include <iostream>
using namespace std;
unsigned int m;
unsigned int n;
// Symbols
int symbols[] = { -1, 0, 1 };
unsigned int symbols_size = sizeof(symbol
以下是打印和计算加权考试成绩的代码:
def exam(weight,score_earned,score_shift):
if (score_shift==1):
shift_amount=input("What was the shift amount?")
score_earned=int(shift_amount+score_earned)
if (score_earned >100):
score_earned=100
print("Total points = "+st